home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / msdos / animutil / pcmovie / pcmovie.exe next >
Text File  |  1994-01-10  |  388KB  |  4,794 lines

  1. //________  JOB                                                                 
  2. //*                                                                             
  3. //* APP3.GRAPHICS.PCMOVIE -  8Feb91/mrg                                         
  4. //* from CUSGJES.VIKTOR.SOURCE 8Feb91                                           
  5. //* Installs 77 rtnes in APP1.GRAPHICS.PCMOVIE                                  
  6. //*                                                                             
  7. //COMPILE  EXEC  FORTC,OPTIONS='VECTOR,DECK,NOOBJECT'                           
  8. //SYSPUNCH  DD  DISP=(NEW,PASS),UNIT=VIO,DSN=&&OBJIN,                           
  9. //             SPACE=(TRK,(50,50),RLSE),DCB=OBJECT                              
  10. //SYSIN     DD *                                                                
  11. C GRAPHICS LIBRARY FOR RASTER PLOTS                                             
  12. C WRITTEN FOR IBM 3090 VF - VIKTOR K. DECYK, UCLA                               
  13. C COPYRIGHT 1990, REGENTS OF THE UNIVERSITY OF CALIFORNIA                       
  14. C UPDATE: JANUARY 3, 1991                                                       
  15. ********************************************************************/           
  16. *                                                                  */           
  17. * This subroutine library was created ad UCLA.                     */           
  18. *                                                                  */           
  19. * The University of California requires the following disclaimer   */           
  20. * concerning all distributed programs:                             */           
  21. *                                                                  */           
  22. * Although this program material has been tested by its            */           
  23. * contributor, no warranty, expressed or implied, is made by the   */           
  24. * contributor or the University of California as to the accuracy   */           
  25. * and functioning of the program and related program material, nor */           
  26. * shall the fact of the distribution constitute any such warranty, */           
  27. * and no responsibility is assumed by the contributor or the       */           
  28. * University of California, in connection therewith.               */           
  29. *                                                                  */           
  30. ********************************************************************/           
  31. *                                                                               
  32. *****************************************************                           
  33. * GOPEN -- OPENS GRAPHICS LIBRARY                                               
  34. *****************************************************                           
  35. *                                                                               
  36.       SUBROUTINE GOPEN                                                          
  37. C THIS SUBROUTINE OPENS GRAPHICS LIBRARY                                        
  38.       COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE                                      
  39.       IPLOT = 0                                                                 
  40.       CALL STARTG                                                               
  41.       RETURN                                                                    
  42.       END                                                                       
  43. *                                                                               
  44. *****************************************************                           
  45. * gmopen -- initializes compressed raster device                                
  46. * USE GMOPEN INSTEAD OF GOPEN FOR THE CONVERTING RASTER IMAGES TO MFE           
  47. *****************************************************                           
  48. *                                                                               
  49.       SUBROUTINE GMOPEN(IGTYPE,PAL,LPAL)                                        
  50. C THIS SUBROUTINE INITIALIZES COMPRESSED RASTER DEVICE                          
  51. C FOR MFE FORMAT                                                                
  52. C IGTYPE = (1,2,3) = (CGA,EGA,VGA) FORMAT                                       
  53. C PAL = 256 COLOR PALETTE IN RGB FORMAT                                         
  54. C LPAL = LENGTH OF PALETTE (LPAL = 0 MEANS USE DEFAULT PALETTE)                 
  55. C DEFAULT IS VGA FORMAT                                                         
  56.       COMMON /GRDEV/ LX, LY, NBIT, IFRMT, INTRL, IXOR                           
  57.       common /dithpal/ pal64, npal64                                            
  58.       CHARACTER*1 PAL( lpal*3 + 1 )                                             
  59.       character*1 pal64( 768 )                                                  
  60.       CHARACTER*1 C                                                             
  61.       DIMENSION LXS(7), LYS(7), NBITS(4)                                        
  62.       SAVE LXS,LYS,NBITS,ISTART                                                 
  63.    97 FORMAT (18H PROGRAM EXECUTING)                                            
  64.       DATA LXS /512,640,320,640,720,79,1024/                                    
  65.       DATA LYS /342,480,200,350,384,21,781/                                     
  66.       DATA NBITS /1,2,4,8/                                                      
  67.       DATA ISTART /0/                                                           
  68.       IF (ISTART.NE.0) GO TO 90                                                 
  69.       npal64 = 0                                                                
  70.       INTRL  = 0                                                                
  71.       IXOR   = 1                                                                
  72.       NPAL   = 1                                                                
  73.       IFRMT  = 4                                                                
  74.       IXOR   = 0                                                                
  75.                                                                                 
  76.       IF ((IGTYPE.LT.1).OR.(IGTYPE.GT.3)) IGTYPE = 3                            
  77.       ID = IGTYPE                                                               
  78.       IF (ID.EQ.1) then                                                         
  79.          NBIT = 2                                                               
  80.          INTRL = 1                                                              
  81.       else IF (ID.EQ.2) then                                                    
  82.          NBIT = 1                                                               
  83.       else                                                                      
  84.          NBIT = 8                                                               
  85.          NPAL = 0                                                               
  86.       end if                                                                    
  87.                                                                                 
  88.       IF (ID.LT.3) ID = ID + 2                                                  
  89.       LX = LXS(ID)                                                              
  90.       LY = LYS(ID)                                                              
  91.       CALL HEADER(IFRMT,LX,LY,NBIT)                                             
  92.                                                                                 
  93.       if( lpal .ne. 0 ) then                                                    
  94.          do 71 ijes = 1, lpal*3                                                 
  95.             pal64( ijes ) = char(  ichar( pal(ijes) ) / 4   )                   
  96. 71       continue                                                               
  97.       end if                                                                    
  98.                                                                                 
  99.       npal64 = lpal                                                             
  100. C     write( 6,* ) ' npal = ', npal                                             
  101.                                                                                 
  102.       IF (NPAL.EQ.0) then                                                       
  103. C        write( 6,* ) ' gmopen calling wrpal '                                  
  104. C        write( 6,* ) ' ifrmt = ', ifrmt                                        
  105.          CALL WRPAL( pal64, npal64, IFRMT )                                     
  106.       end if                                                                    
  107.                                                                                 
  108.       ISTART = 1                                                                
  109.    90 WRITE (6,97)                                                              
  110.       END                                                                       
  111. *                                                                               
  112. *****************************************************                           
  113. * GRASP1 -- DISPLAYS (X-VX) PHASE SPACE                                         
  114. *****************************************************                           
  115. *                                                                               
  116.       SUBROUTINE GRASP1 (PART,LABEL,TIME,VMAX,NX,ITWO,NP,NPX,CI,IRC)            
  117. C FOR 1D CODE, THIS SUBROUTINE DISPLAYS (X-VX) PHASE SPACE                      
  118.       COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE                                      
  119.       CHARACTER*20 LABEL                                                        
  120.       CHARACTER*12 LBLV, LBLU                                                   
  121.       CHARACTER*44 LBL                                                          
  122.       DIMENSION PART(ITWO,NP)                                                   
  123.       SAVE LW                                                                   
  124.    91 FORMAT (1X,A20,16H PHASE SPACE, T=,F7.2)                                  
  125.       DATA LBLV,LBLU /' VX VERSUS X',' UX VERSUS X'/                            
  126.       DATA LW /1/                                                               
  127.       IRC = 0                                                                   
  128.       IF (NPLOT.LT.1) GO TO 70                                                  
  129. C GET GRAPHICS SIZE PARAMETERS                                                  
  130.       CALL GRPARM(1,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  131.      1,NTCX,NTCY,IGSTYL)                                                        
  132. C FIND SCALES FOR PLOT                                                          
  133.       XMIN = 0.                                                                 
  134.       XMAX = FLOAT(NX)                                                          
  135.       YMIN = -VMAX                                                              
  136.       YMAX = VMAX                                                               
  137. C FIND LOCATION FOR PLOT                                                        
  138.       NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001                                      
  139.       NPL = NPL1 + 1                                                            
  140.       IY = IPLOT/NPL                                                            
  141.       IX = IPLOT - IY*NPL                                                       
  142.       MNX = (IX*IRX + MINX)/NPL                                                 
  143.       MNY = ((NPL1 - IY)*IRY + MINY)/NPL                                        
  144.       LNX = LENX/NPL                                                            
  145.       LNY = LENY/NPL                                                            
  146.       JSTCX = ISTCX/NPL                                                         
  147.       JSTCY = ISTCY/NPL                                                         
  148.       JSLB = ISLB/NPL                                                           
  149.       JCH = ICH/NPL                                                             
  150.       IF (JCH.LT.1) JCH = 1                                                     
  151.       JCW = ICW/NPL                                                             
  152.       IF (JCW.LT.1) JCW = 1                                                     
  153.       IF (IPLOT.GT.0) GO TO 10                                                  
  154.       CALL INITGR(IRX,IRY,JCH,JCW)                                              
  155.       GO TO 20                                                                  
  156. C DRAW GRID                                                                     
  157.    10 CALL SELFMP(IRX,IRY)                                                      
  158.    20 IC = 7                                                                    
  159.       CALL TICKS (XMAX,XMIN,YMAX,YMIN,MNX,MNY,LNX,LNY,JCH,JCW,JSLB,JSTCX        
  160.      1,JSTCY,NTCX,NTCY,IC,LW,IGSTYL)                                            
  161. C WRITE LABELS                                                                  
  162.       AT1 = FLOAT(JCH + JCH/3)                                                  
  163.       AX = FLOAT(MNX - JSLB)                                                    
  164.       AY = FLOAT(MNY - JSTCY) - 2.*AT1                                          
  165.       IT1 = 44                                                                  
  166.       WRITE (LBL,91) LABEL, TIME                                                
  167.       CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)                                      
  168.       IT1 = 12                                                                  
  169.       AY = AY - AT1                                                             
  170.       IF (CI.EQ.0) CALL DRSTRG(LBLV,AX,AY,IC,LW,JCW,IT1)                        
  171.       IF (CI.GT.0) CALL DRSTRG(LBLU,AX,AY,IC,LW,JCW,IT1)                        
  172. C PLOT GRAPH                                                                    
  173.       CALL MAPWIN(XMIN,XMAX,YMIN,YMAX,MNX,LNX,MNY,LNY)                          
  174.       IT2 = 1                                                                   
  175.       IF (NPX.EQ.0) GO TO 40                                                    
  176.       IC = 1                                                                    
  177.       DO 30 J = 1, NPX                                                          
  178.       CALL DRPNTS(PART(1,J),PART(2,J),IT2,IC,LW)                                
  179.    30 CONTINUE                                                                  
  180.    40 IF (NPX.GE.NP) GO TO 60                                                   
  181.       IC = 4                                                                    
  182.       IT1 = NPX + 1                                                             
  183.       DO 50 J = IT1, NP                                                         
  184.       CALL DRPNTS(PART(1,J),PART(2,J),IT2,IC,LW)                                
  185.    50 CONTINUE                                                                  
  186.    60 IPLOT = IPLOT + 1                                                         
  187.       IF (IPLOT.EQ.NPLOT) IPLOT = 0                                             
  188.       IF (IPLOT.GT.0) GO TO 70                                                  
  189.       CALL SGRAPH                                                               
  190.       CALL READC(IRC)                                                           
  191.    70 RETURN                                                                    
  192.       END                                                                       
  193. *                                                                               
  194. *****************************************************                           
  195. * GRAF2 -- LINE PLOT OF Y VS X, FILLS MAX DISPLAY REGION                        
  196. *****************************************************                           
  197. *                                                                               
  198.       SUBROUTINE GRAF2 (Y,LABELY,X,LABELX,N,CHR,NCR,IRC)                        
  199. C THIS SUBROUTINE DOES A LINE PLOT OF Y VERSUS X, WHICH WILL FILL THE           
  200. C MAXIMUM ARE OF THE DISPLAY REGION                                             
  201.       COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE                                      
  202.       CHARACTER*20 LABELY, LABELX                                               
  203.       CHARACTER*48 LBL                                                          
  204.       DIMENSION X(N), Y(N)                                                      
  205.       CHARACTER*(*) CHR                                                         
  206.       SAVE LW,EPS                                                               
  207.    91 FORMAT (A20,8H VERSUS ,A20)                                               
  208.       DATA LW /1/                                                               
  209. C     DATA EPS /8.0E-14/                                                        
  210.       DATA EPS /0./                                                             
  211.       IRC = 0                                                                   
  212.       IF (NPLOT.LT.1) GO TO 40                                                  
  213. C GET GRAPHICS SIZE PARAMETERS                                                  
  214.       CALL GRPARM(1,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  215.      1,NTCX,NTCY,IGSTYL)                                                        
  216. C FIND SCALES FOR PLOT                                                          
  217.       XMIN = X(1)                                                               
  218.       XMAX = XMIN                                                               
  219.       YMIN = Y(1)                                                               
  220.       YMAX = YMIN                                                               
  221.       DO 10 J = 1, N                                                            
  222.       IF (X(J).GT.XMAX) XMAX = X(J)                                             
  223.       IF (X(J).LT.XMIN) XMIN = X(J)                                             
  224.       IF (Y(J).GT.YMAX) YMAX = Y(J)                                             
  225.       IF (Y(J).LT.YMIN) YMIN = Y(J)                                             
  226.    10 CONTINUE                                                                  
  227.       IF ((XMAX - XMIN).LE.EPS) XMAX = XMIN + 1.                                
  228.       IF ((YMAX - YMIN).LE.EPS) YMAX = YMIN + 1.                                
  229. C FIND LOCATION FOR PLOT                                                        
  230.       NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001                                      
  231.       NPL = NPL1 + 1                                                            
  232.       IY = IPLOT/NPL                                                            
  233.       IX = IPLOT - IY*NPL                                                       
  234.       MNX = (IX*IRX + MINX)/NPL                                                 
  235.       MNY = ((NPL1 - IY)*IRY + MINY)/NPL                                        
  236.       LNX = LENX/NPL                                                            
  237.       LNY = LENY/NPL                                                            
  238.       JSTCX = ISTCX/NPL                                                         
  239.       JSTCY = ISTCY/NPL                                                         
  240.       JSLB = ISLB/NPL                                                           
  241.       JCH = ICH/NPL                                                             
  242.       IF (JCH.LT.1) JCH = 1                                                     
  243.       JCW = ICW/NPL                                                             
  244.       IF (JCW.LT.1) JCW = 1                                                     
  245.       IF (IPLOT.GT.0) GO TO 20                                                  
  246.       CALL INITGR(IRX,IRY,JCH,JCW)                                              
  247.       GO TO 30                                                                  
  248. C DRAW GRID                                                                     
  249.    20 CALL SELFMP(IRX,IRY)                                                      
  250.    30 IC = 7                                                                    
  251.       CALL TICKS (XMAX,XMIN,YMAX,YMIN,MNX,MNY,LNX,LNY,JCH,JCW,JSLB,JSTCX        
  252.      1,JSTCY,NTCX,NTCY,IC,LW,IGSTYL)                                            
  253. C WRITE LABELS                                                                  
  254.       AT1 = FLOAT(JCH + JCH/3)                                                  
  255.       AX = FLOAT(MNX - JSLB)                                                    
  256.       AY = FLOAT(MNY - JSTCY) - 2.*AT1                                          
  257.       IT1 = 48                                                                  
  258.       WRITE (LBL,91) LABELY, LABELX                                             
  259.       CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)                                      
  260.       AY = AY - AT1                                                             
  261.       IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)                        
  262. C PLOT CURVE                                                                    
  263.       CALL MAPWIN(XMIN,XMAX,YMIN,YMAX,MNX,LNX,MNY,LNY)                          
  264.       IC = 1                                                                    
  265.       CALL DRLINS (X,Y,N,IC,LW)                                                 
  266.       IPLOT = IPLOT + 1                                                         
  267.       IF (IPLOT.EQ.NPLOT) IPLOT = 0                                             
  268.       IF (IPLOT.GT.0) GO TO 40                                                  
  269.       CALL SGRAPH                                                               
  270.       CALL READC(IRC)                                                           
  271.    40 RETURN                                                                    
  272.       END                                                                       
  273. *                                                                               
  274. *****************************************************                           
  275. * GRAF1 -- PLOT OF Y VS X WITH SPECIFIED DISPLAY REGION                         
  276. *****************************************************                           
  277. *                                                                               
  278.       SUBROUTINE GRAF1(Y,LABELY,YMAX,YMIN,X,LABELX,XMAX,XMIN,N,CHR,NCR,I        
  279.      1RC)                                                                       
  280. C THIS SUBROUTINE DOES A POINT PLOT OF Y VERSUS X, WITH THE MAXIMUM             
  281. C AND MINIMUM VALUES OF THE DISPLAY REGION GIVEN BY YMAX, YMIN, AND             
  282. C XMAX, XMIN, RESPECTIVELY.                                                     
  283.       COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE                                      
  284.       CHARACTER*20 LABELY, LABELX                                               
  285.       CHARACTER*48 LBL                                                          
  286.       DIMENSION X(N), Y(N)                                                      
  287.       CHARACTER*(*) CHR                                                         
  288.       SAVE LW,EPS                                                               
  289.    91 FORMAT (A20,8H VERSUS ,A20)                                               
  290.       DATA LW /1/                                                               
  291. C     DATA EPS /8.0E-14/                                                        
  292.       DATA EPS /0./                                                             
  293.       IRC = 0                                                                   
  294.       IF (NPLOT.LT.1) GO TO 30                                                  
  295. C GET GRAPHICS SIZE PARAMETERS                                                  
  296.       CALL GRPARM(1,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  297.      1,NTCX,NTCY,IGSTYL)                                                        
  298.       IF ((XMAX - XMIN).LE.EPS) XMAX = XMIN + 1.                                
  299.       IF ((YMAX - YMIN).LE.EPS) YMAX = YMIN + 1.                                
  300. C FIND LOCATION FOR PLOT                                                        
  301.       NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001                                      
  302.       NPL = NPL1 + 1                                                            
  303.       IY = IPLOT/NPL                                                            
  304.       IX = IPLOT - IY*NPL                                                       
  305.       MNX = (IX*IRX + MINX)/NPL                                                 
  306.       MNY = ((NPL1 - IY)*IRY + MINY)/NPL                                        
  307.       LNX = LENX/NPL                                                            
  308.       LNY = LENY/NPL                                                            
  309.       JSTCX = ISTCX/NPL                                                         
  310.       JSTCY = ISTCY/NPL                                                         
  311.       JSLB = ISLB/NPL                                                           
  312.       JCH = ICH/NPL                                                             
  313.       IF (JCH.LT.1) JCH = 1                                                     
  314.       JCW = ICW/NPL                                                             
  315.       IF (JCW.LT.1) JCW = 1                                                     
  316.       IF (IPLOT.GT.0) GO TO 10                                                  
  317.       CALL INITGR(IRX,IRY,JCH,JCW)                                              
  318.       GO TO 20                                                                  
  319. C DRAW GRID                                                                     
  320.    10 CALL SELFMP(IRX,IRY)                                                      
  321.    20 IC = 7                                                                    
  322.       CALL TICKS (XMAX,XMIN,YMAX,YMIN,MNX,MNY,LNX,LNY,JCH,JCW,JSLB,JSTCX        
  323.      1,JSTCY,NTCX,NTCY,IC,LW,IGSTYL)                                            
  324. C WRITE LABELS                                                                  
  325.       AT1 = FLOAT(JCH + JCH/3)                                                  
  326.       AX = FLOAT(MNX - JSLB)                                                    
  327.       AY = FLOAT(MNY - JSTCY) - 2.*AT1                                          
  328.       IT1 = 48                                                                  
  329.       WRITE (LBL,91) LABELY, LABELX                                             
  330.       CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)                                      
  331.       AY = AY - AT1                                                             
  332.       IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)                        
  333. C DRAW POINTS                                                                   
  334.       CALL MAPWIN(XMIN,XMAX,YMIN,YMAX,MNX,LNX,MNY,LNY)                          
  335.       IC = 1                                                                    
  336.       CALL DRPNTS (X,Y,N,IC,LW)                                                 
  337.       IPLOT = IPLOT + 1                                                         
  338.       IF (IPLOT.EQ.NPLOT) IPLOT = 0                                             
  339.       IF (IPLOT.GT.0) GO TO 30                                                  
  340.       CALL SGRAPH                                                               
  341.       CALL READC(IRC)                                                           
  342.    30 RETURN                                                                    
  343.       END                                                                       
  344. *                                                                               
  345. *****************************************************                           
  346. * GRAF3 -- M LINE PLOTS OF Y VS X                                               
  347. *****************************************************                           
  348. *                                                                               
  349.       SUBROUTINE GRAF3 (Y,LABELY,X,LABELX,N,M,NV,CHR,NCR,IRC)                   
  350. C THIS SUBROUTINE DOES M LINE PLOTS OF SUBARRAYS OF Y VERSUS X, EACH            
  351. C PLOT WITH N POINTS, ON A SCALE WHICH WILL FILL THE MAXIMUM AREA OF            
  352. C THE DISPLAY REGION.  EACH SUBARRAY IS PLOTTED IN A DIFFERENT COLOR,           
  353. C WITH BLUE, RED, YELLOW, CYAN, MAGENTA, AND GREEN USED IN ORDER.               
  354.       COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE                                      
  355.       CHARACTER*20 LABELY, LABELX                                               
  356.       CHARACTER*48 LBL                                                          
  357.       DIMENSION ICOLOR(8)                                                       
  358.       DIMENSION X(N), Y(NV,M)                                                   
  359.       CHARACTER*(*) CHR                                                         
  360.       SAVE LW,EPS,ICOLOR                                                        
  361.    91 FORMAT (A20,8H VERSUS ,A20)                                               
  362.       DATA LW /1/                                                               
  363. C     DATA EPS /8.0E-14/                                                        
  364.       DATA EPS /0./                                                             
  365. C COLORS ARE: BACKGROUND,BLUE,RED,YELLOW,CYAN,MAGENTA,GREEN,FOREGROUND          
  366.       DATA ICOLOR /0,1,4,6,3,5,2,7/                                             
  367.       IRC = 0                                                                   
  368.       IF (NPLOT.LT.1) GO TO 60                                                  
  369. C GET GRAPHICS SIZE PARAMETERS                                                  
  370.       CALL GRPARM(1,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  371.      1,NTCX,NTCY,IGSTYL)                                                        
  372. C FIND SCALES FOR PLOT                                                          
  373.       XMIN = X(1)                                                               
  374.       XMAX = XMIN                                                               
  375.       YMIN = Y(1,1)                                                             
  376.       YMAX = YMIN                                                               
  377.       DO 20 J = 1, N                                                            
  378.       IF (X(J).GT.XMAX) XMAX = X(J)                                             
  379.       IF (X(J).LT.XMIN) XMIN = X(J)                                             
  380.       DO 10 K = 1, M                                                            
  381.       IF (Y(J,K).GT.YMAX) YMAX = Y(J,K)                                         
  382.       IF (Y(J,K).LT.YMIN) YMIN = Y(J,K)                                         
  383.    10 CONTINUE                                                                  
  384.    20 CONTINUE                                                                  
  385.       IF ((XMAX - XMIN).LE.EPS) XMAX = XMIN + 1.                                
  386.       IF ((YMAX - YMIN).LE.EPS) YMAX = YMIN + 1.                                
  387. C FIND LOCATION FOR PLOT                                                        
  388.       NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001                                      
  389.       NPL = NPL1 + 1                                                            
  390.       IY = IPLOT/NPL                                                            
  391.       IX = IPLOT - IY*NPL                                                       
  392.       MNX = (IX*IRX + MINX)/NPL                                                 
  393.       MNY = ((NPL1 - IY)*IRY + MINY)/NPL                                        
  394.       LNX = LENX/NPL                                                            
  395.       LNY = LENY/NPL                                                            
  396.       JSTCX = ISTCX/NPL                                                         
  397.       JSTCY = ISTCY/NPL                                                         
  398.       JSLB = ISLB/NPL                                                           
  399.       JCH = ICH/NPL                                                             
  400.       IF (JCH.LT.1) JCH = 1                                                     
  401.       JCW = ICW/NPL                                                             
  402.       IF (JCW.LT.1) JCW = 1                                                     
  403.       IF (IPLOT.GT.0) GO TO 30                                                  
  404.       CALL INITGR(IRX,IRY,JCH,JCW)                                              
  405.       GO TO 40                                                                  
  406. C DRAW GRID                                                                     
  407.    30 CALL SELFMP(IRX,IRY)                                                      
  408.    40 IC = 7                                                                    
  409.       CALL TICKS (XMAX,XMIN,YMAX,YMIN,MNX,MNY,LNX,LNY,JCH,JCW,JSLB,JSTCX        
  410.      1,JSTCY,NTCX,NTCY,IC,LW,IGSTYL)                                            
  411. C WRITE LABELS                                                                  
  412.       AT1 = FLOAT(JCH + JCH/3)                                                  
  413.       AX = FLOAT(MNX - JSLB)                                                    
  414.       AY = FLOAT(MNY - JSTCY) - 2.*AT1                                          
  415.       IT1 = 48                                                                  
  416.       WRITE (LBL,91) LABELY, LABELX                                             
  417.       CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)                                      
  418.       AY = AY - AT1                                                             
  419.       IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)                        
  420. C PLOT CURVES                                                                   
  421.       CALL MAPWIN(XMIN,XMAX,YMIN,YMAX,MNX,LNX,MNY,LNY)                          
  422.       DO 50 K = 1, M                                                            
  423.       IT1 = (K - 1)/7                                                           
  424.       IC = K - 7*IT1                                                            
  425.       CALL DRLINS (X,Y(1,K),N,ICOLOR(IC+1),LW)                                  
  426.    50 CONTINUE                                                                  
  427.       IPLOT = IPLOT + 1                                                         
  428.       IF (IPLOT.EQ.NPLOT) IPLOT = 0                                             
  429.       IF (IPLOT.GT.0) GO TO 60                                                  
  430.       CALL SGRAPH                                                               
  431.       CALL READC(IRC)                                                           
  432.    60 RETURN                                                                    
  433.       END                                                                       
  434. *                                                                               
  435. *****************************************************                           
  436. * DISP -- PLOTS M SUBARRAYS USING A COMMON SCALE                                
  437. *****************************************************                           
  438. *                                                                               
  439.       SUBROUTINE DISP (F,LABEL,XMIN,XMAX,N,M,NV,ISC,CHR,NCR,IRC)                
  440. C THIS SUBROUTINE DISPLAYS M SUBARRAYS OF THE ARRAY F, EACH PLOT WITH N         
  441. C POINTS, ON A COMMON SCALE GIVEN BY YMAX = 2**ISC, YMIN = -2**ISC,             
  442. C VERSUS A LINEAR FUNCTION IN X, WHERE XMIN < X < XMAX.  IF ABS(ISC) >          
  443. C 116, THEN THE PROGRAM FINDS THE MINIMUM VALUE OF ISC WHICH WILL CON-          
  444. C TAIN THE PLOTS.  EACH SUBARRAY IS PLOTTED IN A DIFFERENT COLOR,               
  445. C WITH BLUE, RED, YELLOW, CYAN, MAGENTA, AND GREEN USED IN ORDER.               
  446.       COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE                                      
  447.       CHARACTER*20 LABEL                                                        
  448.       CHARACTER*36 LBL                                                          
  449.       DIMENSION F(NV,M)                                                         
  450.       CHARACTER*(*) CHR                                                         
  451.       DIMENSION ICOLOR(8)                                                       
  452.       DIMENSION X(2)                                                            
  453.       SAVE LW,DV,ICOLOR                                                         
  454.    91 FORMAT (A20,8H, SCALE=,I8)                                                
  455.       DATA LW /1/                                                               
  456.       DATA DV /2./                                                              
  457. C COLORS ARE: BACKGROUND,BLUE,RED,YELLOW,CYAN,MAGENTA,GREEN,FOREGROUND          
  458.       DATA ICOLOR /0,1,4,6,3,5,2,7/                                             
  459.       IRC = 0                                                                   
  460.       IF (NPLOT.LT.1) GO TO 90                                                  
  461. C GET GRAPHICS SIZE PARAMETERS                                                  
  462.       CALL GRPARM(1,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  463.      1,NTCX,NTCY,IGSTYL)                                                        
  464. C FIND SCALES FOR PLOT                                                          
  465.       IS = ISC                                                                  
  466.       IF (IABS(IS).LE.116) GO TO 30                                             
  467.       FMAX = ABS(F(1,1))                                                        
  468.       DO 20 J = 1, M                                                            
  469.       DO 10 I = 1, N                                                            
  470.       AT1 = ABS(F(I,J))                                                         
  471.       IF (AT1.GT.FMAX) FMAX = AT1                                               
  472.    10 CONTINUE                                                                  
  473.    20 CONTINUE                                                                  
  474.       IF (FMAX.EQ.0.) FMAX = 1.0E-35                                            
  475.       IS = ALOG(FMAX)/ALOG(DV)                                                  
  476.       IF (FMAX.GE.1.) IS = IS + 1                                               
  477.    30 YMAX = DV**IS                                                             
  478.       YMIN = -YMAX                                                              
  479. C FIND LOCATION FOR PLOT                                                        
  480.       NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001                                      
  481.       NPL = NPL1 + 1                                                            
  482.       IY = IPLOT/NPL                                                            
  483.       IX = IPLOT - IY*NPL                                                       
  484.       MNX = (IX*IRX + MINX)/NPL                                                 
  485.       MNY = ((NPL1 - IY)*IRY + MINY)/NPL                                        
  486.       LNX = LENX/NPL                                                            
  487.       LNY = LENY/NPL                                                            
  488.       JSTCX = ISTCX/NPL                                                         
  489.       JSTCY = ISTCY/NPL                                                         
  490.       JSLB = ISLB/NPL                                                           
  491.       JCH = ICH/NPL                                                             
  492.       IF (JCH.LT.1) JCH = 1                                                     
  493.       JCW = ICW/NPL                                                             
  494.       IF (JCW.LT.1) JCW = 1                                                     
  495.       IF (IPLOT.GT.0) GO TO 40                                                  
  496.       CALL INITGR(IRX,IRY,JCH,JCW)                                              
  497.       GO TO 50                                                                  
  498. C DRAW GRID                                                                     
  499.    40 CALL SELFMP(IRX,IRY)                                                      
  500.    50 IC = 7                                                                    
  501.       CALL TICKS (XMAX,XMIN,YMAX,YMIN,MNX,MNY,LNX,LNY,JCH,JCW,JSLB,JSTCX        
  502.      1,JSTCY,NTCX,NTCY,IC,LW,IGSTYL)                                            
  503. C WRITE LABELS                                                                  
  504.       AT1 = FLOAT(JCH + JCH/3)                                                  
  505.       AX = FLOAT(MNX - JSLB)                                                    
  506.       AY = FLOAT(MNY - JSTCY) - 2.*AT1                                          
  507.       IT1 = 36                                                                  
  508.       WRITE (LBL,91) LABEL, IS                                                  
  509.       CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)                                      
  510.       AY = AY - AT1                                                             
  511.       IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)                        
  512. C DRAW CURVES                                                                   
  513.       CALL MAPWIN(XMIN,XMAX,YMIN,YMAX,MNX,LNX,MNY,LNY)                          
  514.       IF (N.LT.2) GO TO 80                                                      
  515.       IT2 = 2                                                                   
  516.       N1 = N - 1                                                                
  517.       DX = (XMAX - XMIN)/FLOAT(N1)                                              
  518.       DO 70 K = 1, M                                                            
  519.       IT1 = (K - 1)/7                                                           
  520.       IC = K - 7*IT1                                                            
  521.       IT3 = ICOLOR(IC+1)                                                        
  522.       X(2) = XMIN                                                               
  523.       DO 60 I = 1, N1                                                           
  524.       X(1) = X(2)                                                               
  525.       X(2) = XMIN + DX*FLOAT(I)                                                 
  526.       CALL DRLINS (X,F(I,K),IT2,IT3,LW)                                         
  527.    60 CONTINUE                                                                  
  528.    70 CONTINUE                                                                  
  529.    80 IPLOT = IPLOT + 1                                                         
  530.       IF (IPLOT.EQ.NPLOT) IPLOT = 0                                             
  531.       IF (IPLOT.GT.0) GO TO 90                                                  
  532.       CALL SGRAPH                                                               
  533.       CALL READC(IRC)                                                           
  534.    90 RETURN                                                                    
  535.       END                                                                       
  536. *                                                                               
  537. *****************************************************                           
  538. * DISP1 -- DISPLAYS M SUBARRAYS OF ARRAY F                                      
  539. *****************************************************                           
  540. *                                                                               
  541.       SUBROUTINE DISP1 (F,LABEL,XMIN,XMAX,N,M,NV,ISC,IST,CHR,NCR,IRC)           
  542. C THIS SUBROUTINE DISPLAYS M SUBARRAYS OF THE ARRAY F, EACH PLOT WITH N         
  543. C POINTS, VERSUS A LINEAR FUNCTION IN X, WHERE XMIN < X < XMAX.                 
  544. C THE PLOTS HAVE A COMMON SCALE IN Y GIVEN BY YMAX AND YMIN.                    
  545. C IF IST = 0, THEN YMAX = 2**ISC AND YMIN = -2**ISC.                            
  546. C IF IST > 0, THEN YMAX = 2**ISC AND YMIN = 0.                                  
  547. C IF IST < 0, THEN YMAX = 0 AND YMIN = -2**ISC.                                 
  548. C IF ABS(ISC) > 116, THEN THE PROGRAM FINDS THE MINIMUM VALUE OF ISC            
  549. C WHICH WILL CONTAIN THE PLOTS.  EACH SUBARRAY IS PLOTTED IN A DIFFERENT        
  550. C COLOR, WITH BLUE, RED, YELLOW, CYAN, MAGENTA, AND GREEN USED IN ORDER.        
  551.       COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE                                      
  552.       CHARACTER*20 LABEL                                                        
  553.       CHARACTER*36 LBL                                                          
  554.       DIMENSION F(NV,M)                                                         
  555.       CHARACTER*(*) CHR                                                         
  556.       DIMENSION ICOLOR(8)                                                       
  557.       DIMENSION X(2)                                                            
  558.       SAVE LW,DV,ICOLOR                                                         
  559.    91 FORMAT (A20,8H, SCALE=,I8)                                                
  560.       DATA LW /1/                                                               
  561.       DATA DV /2./                                                              
  562. C COLORS ARE: BACKGROUND,BLUE,RED,YELLOW,CYAN,MAGENTA,GREEN,FOREGROUND          
  563.       DATA ICOLOR /0,1,4,6,3,5,2,7/                                             
  564.       IRC = 0                                                                   
  565.       IF (NPLOT.LT.1) GO TO 90                                                  
  566. C GET GRAPHICS SIZE PARAMETERS                                                  
  567.       CALL GRPARM(1,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  568.      1,NTCX,NTCY,IGSTYL)                                                        
  569. C FIND SCALES FOR PLOT                                                          
  570.       IS = ISC                                                                  
  571.       IF (IABS(IS).LE.116) GO TO 30                                             
  572.       FMAX = ABS(F(1,1))                                                        
  573.       DO 20 J = 1, M                                                            
  574.       DO 10 I = 1, N                                                            
  575.       AT1 = ABS(F(I,J))                                                         
  576.       IF (AT1.GT.FMAX) FMAX = AT1                                               
  577.    10 CONTINUE                                                                  
  578.    20 CONTINUE                                                                  
  579.       IF (FMAX.EQ.0.) FMAX = 1.0E-35                                            
  580.       IS = ALOG(FMAX)/ALOG(DV)                                                  
  581.       IF (FMAX.GE.1.) IS = IS + 1                                               
  582.    30 YMAX = DV**IS                                                             
  583.       YMIN = -YMAX                                                              
  584.       IF (IST.GT.0) YMIN = 0.                                                   
  585.       IF (IST.LT.0) YMAX = 0.                                                   
  586. C FIND LOCATION FOR PLOT                                                        
  587.       NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001                                      
  588.       NPL = NPL1 + 1                                                            
  589.       IY = IPLOT/NPL                                                            
  590.       IX = IPLOT - IY*NPL                                                       
  591.       MNX = (IX*IRX + MINX)/NPL                                                 
  592.       MNY = ((NPL1 - IY)*IRY + MINY)/NPL                                        
  593.       LNX = LENX/NPL                                                            
  594.       LNY = LENY/NPL                                                            
  595.       JSTCX = ISTCX/NPL                                                         
  596.       JSTCY = ISTCY/NPL                                                         
  597.       JSLB = ISLB/NPL                                                           
  598.       JCH = ICH/NPL                                                             
  599.       IF (JCH.LT.1) JCH = 1                                                     
  600.       JCW = ICW/NPL                                                             
  601.       IF (JCW.LT.1) JCW = 1                                                     
  602.       IF (IPLOT.GT.0) GO TO 40                                                  
  603.       CALL INITGR(IRX,IRY,JCH,JCW)                                              
  604.       GO TO 50                                                                  
  605. C DRAW GRID                                                                     
  606.    40 CALL SELFMP(IRX,IRY)                                                      
  607.    50 IC = 7                                                                    
  608.       CALL TICKS (XMAX,XMIN,YMAX,YMIN,MNX,MNY,LNX,LNY,JCH,JCW,JSLB,JSTCX        
  609.      1,JSTCY,NTCX,NTCY,IC,LW,IGSTYL)                                            
  610. C WRITE LABELS                                                                  
  611.       AT1 = FLOAT(JCH + JCH/3)                                                  
  612.       AX = FLOAT(MNX - JSLB)                                                    
  613.       AY = FLOAT(MNY - JSTCY) - 2.*AT1                                          
  614.       IT1 = 36                                                                  
  615.       WRITE (LBL,91) LABEL, IS                                                  
  616.       CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)                                      
  617.       AY = AY - AT1                                                             
  618.       IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)                        
  619. C DRAW CURVES                                                                   
  620.       CALL MAPWIN(XMIN,XMAX,YMIN,YMAX,MNX,LNX,MNY,LNY)                          
  621.       IF (N.LT.2) GO TO 80                                                      
  622.       IT2 = 2                                                                   
  623.       N1 = N - 1                                                                
  624.       DX = (XMAX - XMIN)/FLOAT(N1)                                              
  625.       DO 70 K = 1, M                                                            
  626.       IT1 = (K - 1)/7                                                           
  627.       IC = K - 7*IT1                                                            
  628.       IT3 = ICOLOR(IC+1)                                                        
  629.       X(2) = XMIN                                                               
  630.       DO 60 I = 1, N1                                                           
  631.       X(1) = X(2)                                                               
  632.       X(2) = XMIN + DX*FLOAT(I)                                                 
  633.       CALL DRLINS (X,F(I,K),IT2,IT3,LW)                                         
  634.    60 CONTINUE                                                                  
  635.    70 CONTINUE                                                                  
  636.    80 IPLOT = IPLOT + 1                                                         
  637.       IF (IPLOT.EQ.NPLOT) IPLOT = 0                                             
  638.       IF (IPLOT.GT.0) GO TO 90                                                  
  639.       CALL SGRAPH                                                               
  640.       CALL READC(IRC)                                                           
  641.    90 RETURN                                                                    
  642.       END                                                                       
  643. *                                                                               
  644. *****************************************************                           
  645. * DISP2 -- PLOTS TWO SUBARRAYS OF F                                             
  646. *****************************************************                           
  647. *                                                                               
  648.       SUBROUTINE DISP2 (F,LABEL,XV,XMIN,XMAX,N,M,NV,ISC,CHR,NCR,IRC)            
  649. C THIS SUBROUTINE DISPLAYS TWO SUBARRAYS OF THE ARRAY F, BOTH PLOTS WITH        
  650. C N POINTS, ON A COMMON SCALE GIVEN BY YMAX = 2**ISC, YMIN =-2**ISC,            
  651. C VERSUS A LINEAR FUNCTION IN X, WHERE XMIN < X < XMAX.                         
  652. C IF ABS(ISC) > 116, THEN THE PROGRAM FINDS THE MINIMUM VALUE OF ISC            
  653. C WHICH WILL CONTAIN THE PLOTS.  THE FIRST SUBARRAY IS DRAWN AS A LINE          
  654. C PLOT, AND THE SECOND AS SMALL CLOSED CIRCLES.  IN ADDITION, A VERTICAL        
  655. C LINE AT LOCATION X = XV IS DRAWN.  THE FIRST SUBARRAY IS PLOTTED IN           
  656. C BLUE AND THE SECOND IN RED.                                                   
  657.       COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE                                      
  658.       CHARACTER*1 CHS                                                           
  659.       CHARACTER*20 LABEL                                                        
  660.       CHARACTER*36 LBL                                                          
  661.       DIMENSION F(NV,M)                                                         
  662.       CHARACTER*(*) CHR                                                         
  663.       DIMENSION X(2), Y(2)                                                      
  664.       SAVE LW,DV,CHS                                                            
  665.    91 FORMAT (A20,8H, SCALE=,I8)                                                
  666.       DATA LW /1/                                                               
  667.       DATA DV /2./                                                              
  668.       DATA CHS /'o'/                                                            
  669.       IRC = 0                                                                   
  670.       IF (NPLOT.LT.1) GO TO 90                                                  
  671. C GET GRAPHICS SIZE PARAMETERS                                                  
  672.       CALL GRPARM(1,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  673.      1,NTCX,NTCY,IGSTYL)                                                        
  674. C FIND SCALES FOR PLOT                                                          
  675.       IS = ISC                                                                  
  676.       IF (IABS(IS).LE.116) GO TO 30                                             
  677.       FMAX = ABS(F(1,1))                                                        
  678.       DO 20 J = 1, M                                                            
  679.       DO 10 I = 1, N                                                            
  680.       AT1 = ABS(F(I,J))                                                         
  681.       IF (AT1.GT.FMAX) FMAX = AT1                                               
  682.    10 CONTINUE                                                                  
  683.    20 CONTINUE                                                                  
  684.       IF (FMAX.EQ.0.) FMAX = 1.0E-35                                            
  685.       IS = ALOG(FMAX)/ALOG(DV)                                                  
  686.       IF (FMAX.GE.1.) IS = IS + 1                                               
  687.    30 YMAX = DV**IS                                                             
  688.       YMIN = -YMAX                                                              
  689. C FIND LOCATION FOR PLOT                                                        
  690.       NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001                                      
  691.       NPL = NPL1 + 1                                                            
  692.       IY = IPLOT/NPL                                                            
  693.       IX = IPLOT - IY*NPL                                                       
  694.       MNX = (IX*IRX + MINX)/NPL                                                 
  695.       MNY = ((NPL1 - IY)*IRY + MINY)/NPL                                        
  696.       LNX = LENX/NPL                                                            
  697.       LNY = LENY/NPL                                                            
  698.       JSTCX = ISTCX/NPL                                                         
  699.       JSTCY = ISTCY/NPL                                                         
  700.       JSLB = ISLB/NPL                                                           
  701.       JCH = ICH/NPL                                                             
  702.       IF (JCH.LT.1) JCH = 1                                                     
  703.       JCW = ICW/NPL                                                             
  704.       IF (JCW.LT.1) JCW = 1                                                     
  705.       IF (IPLOT.GT.0) GO TO 40                                                  
  706.       CALL INITGR(IRX,IRY,JCH,JCW)                                              
  707.       GO TO 50                                                                  
  708. C DRAW GRID                                                                     
  709.    40 CALL SELFMP(IRX,IRY)                                                      
  710.    50 IC = 7                                                                    
  711.       CALL TICKS (XMAX,XMIN,YMAX,YMIN,MNX,MNY,LNX,LNY,JCH,JCW,JSLB,JSTCX        
  712.      1,JSTCY,NTCX,NTCY,IC,LW,IGSTYL)                                            
  713. C WRITE LABELS                                                                  
  714.       AT1 = FLOAT(JCH + JCH/3)                                                  
  715.       AX = FLOAT(MNX - JSLB)                                                    
  716.       AY = FLOAT(MNY - JSTCY) - 2.*AT1                                          
  717.       IT1 = 36                                                                  
  718.       WRITE (LBL,91) LABEL, IS                                                  
  719.       CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)                                      
  720.       AY = AY - AT1                                                             
  721.       IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)                        
  722.       CALL MAPWIN(XMIN,XMAX,YMIN,YMAX,MNX,LNX,MNY,LNY)                          
  723. C SPECIAL CASE OF VERTICAL LINE                                                 
  724.       X(1) = XV                                                                 
  725.       Y(1) = YMIN                                                               
  726.       X(2) = XV                                                                 
  727.       Y(2) = YMAX                                                               
  728.       CALL DRLINS (X,Y,2,IC,LW)                                                 
  729. C MULTIPLE CURVES                                                               
  730.       IF (N.LT.2) GO TO 80                                                      
  731.       IT1 = 2                                                                   
  732.       N1 = N - 1                                                                
  733.       DX = (XMAX - XMIN)/FLOAT(N1)                                              
  734. C FIRST CURVE IS SOLID LINE                                                     
  735.       IC = 1                                                                    
  736.       X(2) = XMIN                                                               
  737.       DO 60 I = 1, N1                                                           
  738.       X(1) = X(2)                                                               
  739.       X(2) = XMIN + DX*FLOAT(I)                                                 
  740.       CALL DRLINS (X,F(I,1),IT1,IC,LW)                                          
  741.    60 CONTINUE                                                                  
  742. C SECOND CURVE IS POINTS                                                        
  743.       IF (M.EQ.1) GO TO 80                                                      
  744.       IC = 4                                                                    
  745.       IT1 = 1                                                                   
  746.       DXH = .3*FLOAT(JCW)*(XMAX - XMIN)/FLOAT(LNX)                              
  747.       DYH = .25*FLOAT(JCH)*(YMAX - YMIN)/FLOAT(LNY)                             
  748.       DO 70 I = 1, N                                                            
  749.       AX = XMIN + DX*FLOAT(I - 1) - DXH                                         
  750.       AY = F(I,2) - DYH                                                         
  751.       CALL DRSTRG(CHS,AX,AY,IC,LW,JCW,IT1)                                      
  752.    70 CONTINUE                                                                  
  753.    80 IPLOT = IPLOT + 1                                                         
  754.       IF (IPLOT.EQ.NPLOT) IPLOT = 0                                             
  755.       IF (IPLOT.GT.0) GO TO 90                                                  
  756.       CALL SGRAPH                                                               
  757.       CALL READC(IRC)                                                           
  758.    90 RETURN                                                                    
  759.       END                                                                       
  760. *                                                                               
  761. *****************************************************                           
  762. * CONTUR -- CONTOUR PLOT OF FUNCTION F                                          
  763. *****************************************************                           
  764. *                                                                               
  765.       SUBROUTINE CONTUR (F,LINK,LABEL,NX,NY,NC,NXV,CHR,NCR,IRC)                 
  766. C CONTUR DOES A CONTOUR PLOT OF THE FUNCTION F, FOR VALUES OF THE FIRST         
  767. C INDEX IN THE RANGE 1 < I < N, AND OF THE SECOND INDEX 1 < J < M.  NC          
  768. C CONTOUR INTERVALS ARE CHOSEN, SPACED EQUALLY BETWEEN THE MAXIMUM AND          
  769. C MINIMUM VALUES OF F.  SEVEN COLORS ARE USED TO PLOT THE CONTOURS.             
  770. C RED, MAGENTA, YELLOW, FOREGROUND, CYAN, GREEN, AND BLUE ARE USED IN           
  771. C GOING FROM HIGHEST TO LOWEST VALUES.                                          
  772. C ISTYLE = (0,1) = CONTOUR PLOT (FILLS AREA,PRESERVES ASPECT RATIO)             
  773.       COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE                                      
  774.       LOGICAL*1 LINK(2,NX,NY)                                                   
  775.       CHARACTER*20 LABEL                                                        
  776.       CHARACTER*57 LBL                                                          
  777.       DIMENSION F(NXV,NY)                                                       
  778.       CHARACTER*(*) CHR                                                         
  779.       DIMENSION X(2), Y(2), C(2)                                                
  780.    91 FORMAT (A20,5H MAX=,E10.3,5H MIN=,E10.3,4H NC=,I3)                        
  781.       SAVE LW,ISTYLE,ZERO,ONE                                                   
  782.       DATA LW,ISTYLE /1,1/                                                      
  783.       DATA ZERO,ONE /0.,1./                                                     
  784.       IRC = 0                                                                   
  785.       IF (NPLOT.LT.1) GO TO 70                                                  
  786.       ANX = FLOAT(NX)                                                           
  787.       ANY = FLOAT(NY)                                                           
  788. C GET GRAPHICS SIZE PARAMETERS                                                  
  789.       CALL GRPARM(2,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  790.      1,NTCX,NTCY,IGSTYL)                                                        
  791. C FIND SCALES FOR PLOT                                                          
  792.       FMIN = F(1,1)                                                             
  793.       FMAX = FMIN                                                               
  794.       DO 20 K = 1, NY                                                           
  795.       DO 10 J = 1, NX                                                           
  796.       IF (F(J,K).GT.FMAX) FMAX = F(J,K)                                         
  797.       IF (F(J,K).LT.FMIN) FMIN = F(J,K)                                         
  798.    10 CONTINUE                                                                  
  799.    20 CONTINUE                                                                  
  800. C FIND LOCATION FOR PLOT                                                        
  801.       NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001                                      
  802.       NPL = NPL1 + 1                                                            
  803.       IY = IPLOT/NPL                                                            
  804.       IX = IPLOT - IY*NPL                                                       
  805.       MNX = (IX*IRX + MINX)/NPL                                                 
  806.       MNY = ((NPL1 - IY)*IRY + MINY)/NPL                                        
  807.       LNX = LENX/NPL                                                            
  808.       LNY = LENY/NPL                                                            
  809.       JSLB = ISLB/NPL                                                           
  810.       JCH = ICH/NPL                                                             
  811.       IF (JCH.LT.1) JCH = 1                                                     
  812.       JCW = ICW/NPL                                                             
  813.       IF (JCW.LT.1) JCW = 1                                                     
  814.       IF (IPLOT.GT.0) GO TO 30                                                  
  815.       CALL INITGR(IRX,IRY,JCH,JCW)                                              
  816.       GO TO 40                                                                  
  817. C DRAW GRID                                                                     
  818.    30 CALL SELFMP(IRX,IRY)                                                      
  819.    40 IC = 7                                                                    
  820.       MNX0 = MNX                                                                
  821.       MNY0 = MNY                                                                
  822.       IF (ISTYLE.EQ.0) GO TO 50                                                 
  823.       MXX = MNX + LNX                                                           
  824.       MXY = MNY + LNY                                                           
  825.       IF (NY.GT.NX) LNX = FLOAT(LNX)*(ANX/ANY) + .5                             
  826.       IF (NX.GT.NY) LNY = FLOAT(LNY)*(ANY/ANX) + .5                             
  827.       MNX = MXX - LNX                                                           
  828.       MNY = MXY - LNY                                                           
  829. C DRAW BOX                                                                      
  830.    50 CALL BOX (MNX,MNY,LNX,LNY,JCH,JCW,IC,LW,IGSTYL)                           
  831. C WRITE LABELS                                                                  
  832.       AT1 = FLOAT(JCH + JCH/3)                                                  
  833.       AX = FLOAT(MNX0 - JSLB)                                                   
  834.       AY = FLOAT(MNY0) - AT1                                                    
  835.       IT1 = 57                                                                  
  836.       WRITE (LBL,91) LABEL, FMAX, FMIN, NC                                      
  837.       CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)                                      
  838.       AY = AY - AT1                                                             
  839.       IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)                        
  840. C DRAW CONTOURS                                                                 
  841.       IF (FMAX.EQ.FMIN) GO TO 60                                                
  842.       CALL MAPWIN(ZERO,ANX,ZERO,ANY,MNX,LNX,MNY,LNY)                            
  843. C FIX STARTING VALUE AND INCREMENT FOR SPATIAL COORDINATES                      
  844.       X(1) = ZERO                                                               
  845.       Y(1) = ZERO                                                               
  846.       X(2) = ONE                                                                
  847.       Y(2) = ONE                                                                
  848. C FIX FIRST CONTOUR LEVEL AND CONTOUR INTERVAL                                  
  849.       C(2) = (FMAX - FMIN)/FLOAT(NC)                                            
  850.       C(1) = FMIN + .5*C(2)                                                     
  851.       CALL CONTRU (X,Y,F,C,NX,NY,NC,LINK,NXV,LW)                                
  852.    60 IPLOT = IPLOT + 1                                                         
  853.       IF (IPLOT.EQ.NPLOT) IPLOT = 0                                             
  854.       IF (IPLOT.GT.0) GO TO 70                                                  
  855.       CALL SGRAPH                                                               
  856.       CALL READC(IRC)                                                           
  857.    70 RETURN                                                                    
  858.       END                                                                       
  859. *                                                                               
  860. *****************************************************                           
  861. * DISPCN -- CONTOUR PLOT OF FUNCTION F                                          
  862. *****************************************************                           
  863. *                                                                               
  864.       SUBROUTINE DISPCN (F,LINK,LABEL,NX,NY,NC,NXV,ISC,CHR,NCR,IRC)             
  865. C DISPCN DOES A CONTOUR PLOT OF THE FUNCTION F, FOR VALUES OF THE FIRST         
  866. C INDEX IN THE RANGE 1 < I < N, AND OF THE SECOND INDEX 1 < J < M.  NC          
  867. C CONTOUR INTERVALS ARE CHOSEN, SPACED EQUALLY BETWEEN FMAX = 2**ISC AND        
  868. C FMIN = -2**ISC.  IF ABS(ISC) > 116, THEN THE PROGRAM FINDS THE MINIMUM        
  869. C VALUE OF ISC WHICH WILL CONTAIN THE FUNCTION VALUES.  SEVEN COLORS ARE        
  870. C USED TO PLOT THE CONTOURS.  RED, MAGENTA, YELLOW, FOREGROUND, CYAN,           
  871. C GREEN, AND BLUE ARE USED IN GOING FROM HIGHEST TO LOWEST VALUES.              
  872. C ISTYLE = (0,1) = CONTOUR PLOT (FILLS AREA,PRESERVES ASPECT RATIO)             
  873.       COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE                                      
  874.       LOGICAL*1 LINK(2,NX,NY)                                                   
  875.       CHARACTER*20 LABEL                                                        
  876.       CHARACTER*40 LBL                                                          
  877.       DIMENSION F(NXV,NY)                                                       
  878.       CHARACTER*(*) CHR                                                         
  879.       DIMENSION X(2), Y(2), C(2)                                                
  880.    91 FORMAT (A20,8H, SCALE=,I5,4H NC=,I3)                                      
  881.       SAVE LW,ISTYLE,DV,ZERO,ONE                                                
  882.       DATA LW,ISTYLE /1,1/                                                      
  883.       DATA DV /2./                                                              
  884.       DATA ZERO,ONE /0.,1./                                                     
  885.       IRC = 0                                                                   
  886.       IF (NPLOT.LT.1) GO TO 70                                                  
  887.       ANX = FLOAT(NX)                                                           
  888.       ANY = FLOAT(NY)                                                           
  889. C GET GRAPHICS SIZE PARAMETERS                                                  
  890.       CALL GRPARM(2,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  891.      1,NTCX,NTCY,IGSTYL)                                                        
  892. C FIND SCALES FOR PLOT                                                          
  893.       IS = ISC                                                                  
  894.       IF (IABS(IS).LE.116) GO TO 30                                             
  895.       FMAX = ABS(F(1,1))                                                        
  896.       DO 20 K = 1, NY                                                           
  897.       DO 10 J = 1, NX                                                           
  898.       AT1 = ABS(F(J,K))                                                         
  899.       IF (AT1.GT.FMAX) FMAX = AT1                                               
  900.    10 CONTINUE                                                                  
  901.    20 CONTINUE                                                                  
  902.       IF (FMAX.EQ.0.) FMAX = 1.0E-35                                            
  903.       IS = ALOG(FMAX)/ALOG(DV)                                                  
  904.       IF (FMAX.GE.1.) IS = IS + 1                                               
  905.    30 FMAX = DV**IS                                                             
  906.       FMIN = -FMAX                                                              
  907. C FIND LOCATION FOR PLOT                                                        
  908.       NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001                                      
  909.       NPL = NPL1 + 1                                                            
  910.       IY = IPLOT/NPL                                                            
  911.       IX = IPLOT - IY*NPL                                                       
  912.       MNX = (IX*IRX + MINX)/NPL                                                 
  913.       MNY = ((NPL1 - IY)*IRY + MINY)/NPL                                        
  914.       LNX = LENX/NPL                                                            
  915.       LNY = LENY/NPL                                                            
  916.       JSLB = ISLB/NPL                                                           
  917.       JCH = ICH/NPL                                                             
  918.       IF (JCH.LT.1) JCH = 1                                                     
  919.       JCW = ICW/NPL                                                             
  920.       IF (JCW.LT.1) JCW = 1                                                     
  921.       IF (IPLOT.GT.0) GO TO 40                                                  
  922.       CALL INITGR(IRX,IRY,JCH,JCW)                                              
  923.       GO TO 50                                                                  
  924. C DRAW GRID                                                                     
  925.    40 CALL SELFMP(IRX,IRY)                                                      
  926.    50 IC = 7                                                                    
  927.       MNX0 = MNX                                                                
  928.       MNY0 = MNY                                                                
  929.       IF (ISTYLE.EQ.0) GO TO 60                                                 
  930.       MXX = MNX + LNX                                                           
  931.       MXY = MNY + LNY                                                           
  932.       IF (NY.GT.NX) LNX = FLOAT(LNX)*(ANX/ANY) + .5                             
  933.       IF (NX.GT.NY) LNY = FLOAT(LNY)*(ANY/ANX) + .5                             
  934.       MNX = MXX - LNX                                                           
  935.       MNY = MXY - LNY                                                           
  936. C DRAW BOX                                                                      
  937.    60 CALL BOX (MNX,MNY,LNX,LNY,JCH,JCW,IC,LW,IGSTYL)                           
  938. C WRITE LABELS                                                                  
  939.       AT1 = FLOAT(JCH + JCH/3)                                                  
  940.       AX = FLOAT(MNX0 - JSLB)                                                   
  941.       AY = FLOAT(MNY0) - AT1                                                    
  942.       IT1 = 40                                                                  
  943.       WRITE (LBL,91) LABEL, IS, NC                                              
  944.       CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)                                      
  945.       AY = AY - AT1                                                             
  946.       IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)                        
  947. C DRAW CONTOURS                                                                 
  948.       CALL MAPWIN(ZERO,ANX,ZERO,ANY,MNX,LNX,MNY,LNY)                            
  949. C FIX STARTING VALUE AND INCREMENT FOR SPATIAL COORDINATES                      
  950.       X(1) = ZERO                                                               
  951.       Y(1) = ZERO                                                               
  952.       X(2) = ONE                                                                
  953.       Y(2) = ONE                                                                
  954. C FIX FIRST CONTOUR LEVEL AND CONTOUR INTERVAL                                  
  955.       C(2) = (FMAX - FMIN)/FLOAT(NC)                                            
  956.       C(1) = FMIN + .5*C(2)                                                     
  957.       CALL CONTRU (X,Y,F,C,NX,NY,NC,LINK,NXV,LW)                                
  958.       IPLOT = IPLOT + 1                                                         
  959.       IF (IPLOT.EQ.NPLOT) IPLOT = 0                                             
  960.       IF (IPLOT.GT.0) GO TO 70                                                  
  961.       CALL SGRAPH                                                               
  962.       CALL READC(IRC)                                                           
  963.    70 RETURN                                                                    
  964.       END                                                                       
  965. *                                                                               
  966. *****************************************************                           
  967. * DSPCN2 -- CONTOUR PLOT OF FUNCTION F                                          
  968. *****************************************************                           
  969. *                                                                               
  970.       SUBROUTINE DSPCN2 (F,LINK,LABEL,XV,YV,NX,NY,NC,NXV,ISC,CHR,NCR,IRC        
  971.      1)                                                                         
  972. C DSPCN2 DOES A CONTOUR PLOT OF THE FUNCTION F, FOR VALUES OF THE FIRST         
  973. C INDEX IN THE RANGE 1 < I < N, AND OF THE SECOND INDEX 1 < J < M.  NC          
  974. C CONTOUR INTERVALS ARE CHOSEN, SPACED EQUALLY BETWEEN FMAX = 2**ISC AND        
  975. C FMIN = -2**ISC.  IF ABS(ISC) > 116, THEN THE PROGRAM FINDS THE MINIMUM        
  976. C VALUE OF ISC WHICH WILL CONTAIN THE FUNCTION VALUES.  IN ADDITION, A          
  977. C PAIR OF VERTICAL AND HORIZONTAL LINES ARE DRAWN AT X = XV AND Y = YV,         
  978. C WHERE THE UNITS ARE 0 < X < N AND 0 < Y < M.  SEVEN COLORS ARE USED TO        
  979. C PLOT THE CONTOURS.  RED, MAGENTA, YELLOW, FOREGROUND, CYAN, GREEN, AND        
  980. C BLUE ARE USED IN GOING FROM HIGHEST TO LOWEST VALUES.                         
  981. C ISTYLE = (0,1) = CONTOUR PLOT (FILLS AREA,PRESERVES ASPECT RATIO)             
  982.       COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE                                      
  983.       LOGICAL*1 LINK(2,NX,NY)                                                   
  984.       CHARACTER*20 LABEL                                                        
  985.       CHARACTER*40 LBL                                                          
  986.       DIMENSION F(NXV,NY)                                                       
  987.       CHARACTER*(*) CHR                                                         
  988.       DIMENSION X(2), Y(2), C(2)                                                
  989.    91 FORMAT (A20,8H, SCALE=,I5,4H NC=,I3)                                      
  990.       SAVE LW,ISTYLE,DV,ZERO,ONE                                                
  991.       DATA LW,ISTYLE /1,1/                                                      
  992.       DATA DV /2./                                                              
  993.       DATA ZERO,ONE /0.,1./                                                     
  994.       IRC = 0                                                                   
  995.       IF (NPLOT.LT.1) GO TO 70                                                  
  996.       ANX = FLOAT(NX)                                                           
  997.       ANY = FLOAT(NY)                                                           
  998. C GET GRAPHICS SIZE PARAMETERS                                                  
  999.       CALL GRPARM(2,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  1000.      1,NTCX,NTCY,IGSTYL)                                                        
  1001. C FIND SCALES FOR PLOT                                                          
  1002.       IS = ISC                                                                  
  1003.       IF (IABS(IS).LE.116) GO TO 30                                             
  1004.       FMAX = ABS(F(1,1))                                                        
  1005.       DO 20 K = 1, NY                                                           
  1006.       DO 10 J = 1, NX                                                           
  1007.       AT1 = ABS(F(J,K))                                                         
  1008.       IF (AT1.GT.FMAX) FMAX = AT1                                               
  1009.    10 CONTINUE                                                                  
  1010.    20 CONTINUE                                                                  
  1011.       IF (FMAX.EQ.0.) FMAX = 1.0E-35                                            
  1012.       IS = ALOG(FMAX)/ALOG(DV)                                                  
  1013.       IF (FMAX.GE.1.) IS = IS + 1                                               
  1014.    30 FMAX = DV**IS                                                             
  1015.       FMIN = -FMAX                                                              
  1016. C FIND LOCATION FOR PLOT                                                        
  1017.       NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001                                      
  1018.       NPL = NPL1 + 1                                                            
  1019.       IY = IPLOT/NPL                                                            
  1020.       IX = IPLOT - IY*NPL                                                       
  1021.       MNX = (IX*IRX + MINX)/NPL                                                 
  1022.       MNY = ((NPL1 - IY)*IRY + MINY)/NPL                                        
  1023.       LNX = LENX/NPL                                                            
  1024.       LNY = LENY/NPL                                                            
  1025.       JSLB = ISLB/NPL                                                           
  1026.       JCH = ICH/NPL                                                             
  1027.       IF (JCH.LT.1) JCH = 1                                                     
  1028.       JCW = ICW/NPL                                                             
  1029.       IF (JCW.LT.1) JCW = 1                                                     
  1030.       IF (IPLOT.GT.0) GO TO 40                                                  
  1031.       CALL INITGR(IRX,IRY,JCH,JCW)                                              
  1032.       GO TO 50                                                                  
  1033. C DRAW GRID                                                                     
  1034.    40 CALL SELFMP(IRX,IRY)                                                      
  1035.    50 IC = 7                                                                    
  1036.       MNX0 = MNX                                                                
  1037.       MNY0 = MNY                                                                
  1038.       IF (ISTYLE.EQ.0) GO TO 60                                                 
  1039.       MXX = MNX + LNX                                                           
  1040.       MXY = MNY + LNY                                                           
  1041.       IF (NY.GT.NX) LNX = FLOAT(LNX)*(ANX/ANY) + .5                             
  1042.       IF (NX.GT.NY) LNY = FLOAT(LNY)*(ANY/ANX) + .5                             
  1043.       MNX = MXX - LNX                                                           
  1044.       MNY = MXY - LNY                                                           
  1045. C DRAW BOX                                                                      
  1046.    60 CALL BOX (MNX,MNY,LNX,LNY,JCH,JCW,IC,LW,IGSTYL)                           
  1047. C WRITE LABELS                                                                  
  1048.       AT1 = FLOAT(JCH + JCH/3)                                                  
  1049.       AX = FLOAT(MNX0 - JSLB)                                                   
  1050.       AY = FLOAT(MNY0) - AT1                                                    
  1051.       IT1 = 40                                                                  
  1052.       WRITE (LBL,91) LABEL, IS, NC                                              
  1053.       CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)                                      
  1054.       AY = AY - AT1                                                             
  1055.       IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)                        
  1056.       CALL MAPWIN(ZERO,ANX,ZERO,ANY,MNX,LNX,MNY,LNY)                            
  1057. C SPECIAL CASE OF VERTICAL AND HORIZONTAL LINES                                 
  1058.       X(1) = XV                                                                 
  1059.       Y(1) = ZERO                                                               
  1060.       X(2) = XV                                                                 
  1061.       Y(2) = ANY                                                                
  1062.       CALL DRLINS (X,Y,2,IC,LW)                                                 
  1063.       X(1) = ZERO                                                               
  1064.       Y(1) = YV                                                                 
  1065.       X(2) = ANX                                                                
  1066.       Y(2) = YV                                                                 
  1067.       CALL DRLINS (X,Y,2,IC,LW)                                                 
  1068. C DRAW CONTOURS                                                                 
  1069. C FIX STARTING VALUE AND INCREMENT FOR SPATIAL COORDINATES                      
  1070.       X(1) = ZERO                                                               
  1071.       Y(1) = ZERO                                                               
  1072.       X(2) = ONE                                                                
  1073.       Y(2) = ONE                                                                
  1074. C FIX FIRST CONTOUR LEVEL AND CONTOUR INTERVAL                                  
  1075.       C(2) = (FMAX - FMIN)/FLOAT(NC)                                            
  1076.       C(1) = FMIN + .5*C(2)                                                     
  1077.       CALL CONTRU (X,Y,F,C,NX,NY,NC,LINK,NXV,LW)                                
  1078.       IPLOT = IPLOT + 1                                                         
  1079.       IF (IPLOT.EQ.NPLOT) IPLOT = 0                                             
  1080.       IF (IPLOT.GT.0) GO TO 70                                                  
  1081.       CALL SGRAPH                                                               
  1082.       CALL READC(IRC)                                                           
  1083.    70 RETURN                                                                    
  1084.       END                                                                       
  1085. *                                                                               
  1086. *****************************************************                           
  1087. * RASTUR -- COLOR RASTER IMAGE OF FUNCTION F                                    
  1088. *****************************************************                           
  1089. *                                                                               
  1090.       SUBROUTINE RASTUR (F,LABEL,NX,NY,NXV,CHR,NCR,IRC)                         
  1091. C RASTUR DOES A COLOR RASTER IMAGE OF THE FUNCTION F, FOR VALUES OF THE         
  1092. C FIRST INDEX IN THE RANGE 1 < I < N, AND OF THE SECOND INDEX 1 < J < M.        
  1093. C SEVEN COLORS ARE USED.  RED, MAGENTA, YELLOW, FOREGROUND, CYAN, GREEN,        
  1094. C AND BLUE ARE USED IN GOING FROM HIGHEST TO LOWEST VALUES                      
  1095. C ISTYLE = (0,1) = CONTOUR PLOT (FILLS AREA,PRESERVES ASPECT RATIO)             
  1096.       COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE                                      
  1097.       CHARACTER*20 LABEL                                                        
  1098.       CHARACTER*50 LBL                                                          
  1099.       DIMENSION F(NXV,NY)                                                       
  1100.       CHARACTER*(*) CHR                                                         
  1101.    91 FORMAT (A20,5H MAX=,E10.3,5H MIN=,E10.3)                                  
  1102.       SAVE LW,ISTYLE,ZERO                                                       
  1103.       DATA LW,ISTYLE /1,1/                                                      
  1104.       DATA ZERO /0./                                                            
  1105.       IRC = 0                                                                   
  1106.       IF (NPLOT.LT.1) GO TO 70                                                  
  1107.       ANX = FLOAT(NX)                                                           
  1108.       ANY = FLOAT(NY)                                                           
  1109. C GET GRAPHICS SIZE PARAMETERS                                                  
  1110.       CALL GRPARM(2,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  1111.      1,NTCX,NTCY,IGSTYL)                                                        
  1112. C FIND SCALES FOR PLOT                                                          
  1113.       FMIN = F(1,1)                                                             
  1114.       FMAX = FMIN                                                               
  1115.       DO 20 K = 1, NY                                                           
  1116.       DO 10 J = 1, NX                                                           
  1117.       IF (F(J,K).GT.FMAX) FMAX = F(J,K)                                         
  1118.       IF (F(J,K).LT.FMIN) FMIN = F(J,K)                                         
  1119.    10 CONTINUE                                                                  
  1120.    20 CONTINUE                                                                  
  1121. C FIND LOCATION FOR PLOT                                                        
  1122.       NPL1 = SQRT(FLOAT(NPLOT-1)) + 0.0001                                      
  1123.       NPL = NPL1 + 1                                                            
  1124.       IY = IPLOT/NPL                                                            
  1125.       IX = IPLOT - IY*NPL                                                       
  1126.       MNX = (IX*IRX + MINX)/NPL                                                 
  1127.       MNY = ((NPL1 - IY)*IRY + MINY)/NPL                                        
  1128.       LNX = LENX/NPL                                                            
  1129.       LNY = LENY/NPL                                                            
  1130.       JSLB = ISLB/NPL                                                           
  1131.       JCH = ICH/NPL                                                             
  1132.       IF (JCH.LT.1) JCH = 1                                                     
  1133.       JCW = ICW/NPL                                                             
  1134.       IF (JCW.LT.1) JCW = 1                                                     
  1135.       IF (IPLOT.GT.0) GO TO 30                                                  
  1136.       CALL INITGR(IRX,IRY,JCH,JCW)                                              
  1137.       GO TO 40                                                                  
  1138. C DRAW GRID                                                                     
  1139.    30 CALL SELFMP(IRX,IRY)                                                      
  1140.    40 IC = 7                                                                    
  1141.       MNX0 = MNX                                                                
  1142.       MNY0 = MNY                                                                
  1143.       IF (ISTYLE.EQ.0) GO TO 50                                                 
  1144.       MXX = MNX + LNX                                                           
  1145.       MXY = MNY + LNY                                                           
  1146.       IF (NY.GT.NX) LNX = FLOAT(LNX)*(ANX/ANY) + .5                             
  1147.       IF (NX.GT.NY) LNY = FLOAT(LNY)*(ANY/ANX) + .5                             
  1148.       MNX = MXX - LNX                                                           
  1149.       MNY = MXY - LNY                                                           
  1150. C WRITE LABELS                                                                  
  1151.    50 AT1 = FLOAT(JCH + JCH/3)                                                  
  1152.       AX = FLOAT(MNX0 - JSLB)                                                   
  1153.       AY = FLOAT(MNY0) - AT1                                                    
  1154.       IT1 = 50                                                                  
  1155.       WRITE (LBL,91) LABEL, FMAX, FMIN                                          
  1156.       CALL DRSTRG(LBL,AX,AY,IC,LW,JCW,IT1)                                      
  1157.       AY = AY - AT1                                                             
  1158.       IF (NCR.GT.0) CALL DRSTRG(CHR,AX,AY,IC,LW,JCW,NCR)                        
  1159. C DRAW RASTER IMAGE                                                             
  1160.       IF (FMAX.EQ.FMIN) GO TO 60                                                
  1161.       AX = FLOAT(LNX)                                                           
  1162.       AY = FLOAT(LNY)                                                           
  1163.       CALL MAPWIN(ZERO,AX,ZERO,AY,MNX,LNX,MNY,LNY)                              
  1164.       CALL RASTRU(F,FMIN,FMAX,LNX,LNY,NX,NY,NXV,LW)                             
  1165.    60 IPLOT = IPLOT + 1                                                         
  1166.       IF (IPLOT.EQ.NPLOT) IPLOT = 0                                             
  1167.       IF (IPLOT.GT.0) GO TO 70                                                  
  1168.       CALL SGRAPH                                                               
  1169.       CALL READC(IRC)                                                           
  1170.    70 RETURN                                                                    
  1171.       END                                                                       
  1172. *                                                                               
  1173. *****************************************************                           
  1174. * TICKS  -- DRAWS BOX, TICKS, GRIDS AND LABELS AXES                             
  1175. *****************************************************                           
  1176. *                                                                               
  1177.       SUBROUTINE TICKS (XMAX,XMIN,YMAX,YMIN,MINX,MINY,LENX,LENY,ICH,ICW,        
  1178.      1ISLB,ISTCX,ISTCY,NTX,NTY,IC,LW,IGSTYL)                                    
  1179. C THIS SUBROUTINE DRAWS BOX, TICKS, GRIDS AND LABELS AXES                       
  1180. C ICH, ICW = CHARACTER HEIGHT AND WIDTH                                         
  1181. C NTX, NTY = NUMBER OF INTERVALS BETWEEN TICKS IN X AND Y DIRECTION             
  1182. C ISTCX, ISTCY = SIZE OF TICK IN X AND Y DIRECTION                              
  1183.       CHARACTER*12 LBL                                                          
  1184.    91 FORMAT (E12.5)                                                            
  1185. C DRAW BOX AROUND GRAPH AND TICKS                                               
  1186.       XMN = FLOAT(MINX)                                                         
  1187.       XMX = FLOAT(MINX + LENX)                                                  
  1188.       YMN = FLOAT(MINY)                                                         
  1189.       YMX = FLOAT(MINY + LENY)                                                  
  1190. C DRAW BOX, GRID, AND TICKS                                                     
  1191.       IF (IGSTYL.EQ.1) CALL GRIDL (XMX,XMN,YMX,YMN,ISTCX,ISTCY,NTX,NTY,I        
  1192.      1C,LW,1)                                                                   
  1193.       IF (IGSTYL.EQ.2) CALL GRIDG (XMX,XMN,YMX,YMN,ICH,ICW,ISTCX,ISTCY,N        
  1194.      1TX,NTY,IC,LW,2)                                                           
  1195. C LABEL AXES                                                                    
  1196.       AX = XMN - FLOAT(ISLB)                                                    
  1197.       AY = YMN - FLOAT(ISTCY + ICH + ICH/3)                                     
  1198.       AT1 = XMX - FLOAT(ISLB)                                                   
  1199.       AT2 = YMX - FLOAT(ICH/2)                                                  
  1200.       IT1 = 12                                                                  
  1201.       WRITE (LBL,91) XMIN                                                       
  1202.       CALL DRSTRG(LBL,XMN,AY,IC,LW,ICW,IT1)                                     
  1203.       WRITE (LBL,91) XMAX                                                       
  1204.       CALL DRSTRG(LBL,AT1,AY,IC,LW,ICW,IT1)                                     
  1205.       WRITE (LBL,91) YMIN                                                       
  1206.       CALL DRSTRG(LBL,AX,YMN,IC,LW,ICW,IT1)                                     
  1207.       WRITE (LBL,91) YMAX                                                       
  1208.       CALL DRSTRG(LBL,AX,AT2,IC,LW,ICW,IT1)                                     
  1209.       RETURN                                                                    
  1210.       END                                                                       
  1211. *                                                                               
  1212. *****************************************************                           
  1213. * BOX -- DRAWS BOX                                                              
  1214. *****************************************************                           
  1215. *                                                                               
  1216.       SUBROUTINE BOX (MINX,MINY,LENX,LENY,ICH,ICW,IC,LW,IGSTYL)                 
  1217. C THIS SUBROUTINE DRAWS BOX                                                     
  1218. C ICH, ICW = CHARACTER HEIGHT AND WIDTH                                         
  1219.       XMN = FLOAT(MINX)                                                         
  1220.       XMX = FLOAT(MINX + LENX)                                                  
  1221.       YMN = FLOAT(MINY)                                                         
  1222.       YMX = FLOAT(MINY + LENY)                                                  
  1223. C DRAW BOX AROUND GRAPH                                                         
  1224.       IF (IGSTYL.EQ.1) CALL BOXL (XMX,XMN,YMX,YMN,IC,LW)                        
  1225.       IF (IGSTYL.EQ.2) CALL BOXG (XMX,XMN,YMX,YMN,ICH,ICW,IC,LW)                
  1226.       RETURN                                                                    
  1227.       END                                                                       
  1228. *                                                                               
  1229. *****************************************************                           
  1230. * CONTRU -- CONTOUR PLOT -- LOWER LEVEL ROUTINE                                 
  1231. *****************************************************                           
  1232. *                                                                               
  1233.       SUBROUTINE CONTRU(XA,YA,Z,C,M,N,L,LINK,MV,LWTYPE)                         
  1234. C SUBROUTINE WRITTEN BY ART ROSS, MODIFIED BY AEINT DE BOER FOR FORT77          
  1235. C BUG FIXED BY VIKTOR DECYK.                                                    
  1236. C SEVEN COLORS ARE USED TO PLOT THE CONTOURS.  RED, MAGENTA, YELLOW,            
  1237. C FOREGROUND, CYAN, GREEN, AND BLUE ARE USED IN GOING FROM HIGHEST TO           
  1238. C LOWEST VALUES.                                                                
  1239. C USING RASTER GRAPHICS                                                         
  1240.       DIMENSION ICOLOR(7)                                                       
  1241.       LOGICAL*1 F1,F2,LINK                                                      
  1242.       DIMENSION C(2),LIM(2),LINK(2,M,N),XA(2),YA(2),Z(MV,N)                     
  1243.       EQUIVALENCE(MM1,LIM(1)),(NM1,LIM(2))                                      
  1244.       SAVE ICOLOR                                                               
  1245. C COLORS ARE: BLUE,GREEN,CYAN,FOREGROUND,YELLOW,MAGENTA,RED                     
  1246.       DATA ICOLOR /1,2,3,7,6,5,4/                                               
  1247.       MM1 = M-1                                                                 
  1248.       NM1 = N-1                                                                 
  1249.       AC = 7./FLOAT(L)                                                          
  1250.       DO 199 LEV=1,L                                                            
  1251.       CLEV = C(1)+(LEV-1)*C(2)                                                  
  1252.       IC = AC*(FLOAT(LEV) - .5)                                                 
  1253.       ICTYPE = ICOLOR(IC+1) + 8                                                 
  1254. C                                                                               
  1255. C   MARK HORIZONTAL LINKS CROSSED BY CONTOUR.                                   
  1256. C                                                                               
  1257.       DO 10 J=1,N                                                               
  1258.       F1 = Z(1,J).GT.CLEV                                                       
  1259.       DO 10 I=1,MM1                                                             
  1260.       F2 = Z(I+1,J).GT.CLEV                                                     
  1261.       LINK(1,I,J) = F1.AND..NOT.F2.OR..NOT.F1.AND.F2                            
  1262. 10    F1 = F2                                                                   
  1263. C                                                                               
  1264. C   MARK VERTICAL LINKS CROSSED BY CONTOUR.                                     
  1265. C                                                                               
  1266.       DO 20 I=1,M                                                               
  1267.       F1 = Z(I,1).GT.CLEV                                                       
  1268.       DO 20 J=1,NM1                                                             
  1269.       F2 = Z(I,J+1).GT.CLEV                                                     
  1270.       LINK(2,I,J) = F1.AND..NOT.F2.OR..NOT.F1.AND.F2                            
  1271. 20    F1 = F2                                                                   
  1272. C                                                                               
  1273. C   FIRST DRAW ALL CONTOURS INTERSECTING EDGES.                                 
  1274. C                                                                               
  1275.       LX = 0                                                                    
  1276.       LY = +1                                                                   
  1277.       I = 1                                                                     
  1278.       J = 1                                                                     
  1279.       ASSIGN 101 TO IFOLLW                                                      
  1280.       DO 103 IDIR=1,4                                                           
  1281.       LIMIT = LIM(1+IABS(LX))                                                   
  1282.       LNKDIR = 1+IABS(LX)                                                       
  1283.       DO 102 K=1,LIMIT                                                          
  1284.       IF(.NOT.LINK(LNKDIR,I,J)) GO TO 101                                       
  1285.       LINK(LNKDIR,I,J) = .FALSE.                                                
  1286.       GO TO 1501                                                                
  1287. C                                                                               
  1288. C   FOLLOWING IS INTERNAL SUBROUTINE TO FOLLOW A CONTOUR, CALLING               
  1289. C THE APPROPRIATE GRAPHICS ROUTINES AS IT GOES.  IT STARTS AT THE LINK          
  1290. C DESIGNATED BY I AND J, CROSSING IT IN THE DIRECTION INDICATED BY              
  1291. C LX AND LY.                                                                    
  1292. 1501  II = I                                                                    
  1293.       JJ = J                                                                    
  1294.       KX = LX                                                                   
  1295.       KY = LY                                                                   
  1296.       ASSIGN 1502 TO IXY                                                        
  1297.       GO TO 1601                                                                
  1298. 1502  CALL DRAWG(' ',XX,YY,ICTYPE,LWTYPE,0,1)                                   
  1299.       ASSIGN 1503 TO IXY                                                        
  1300.       GO TO 1504                                                                
  1301. 1503  CALL DRAWG(' ',XX,YY,ICTYPE,LWTYPE,0,2)                                   
  1302.       LINK(1+IABS(KX),II,JJ) = .FALSE.                                          
  1303. C                                                                               
  1304. C   IL AND JL ARE INDICES OF LL CORNER OF CELL WE ARE ENTERING                  
  1305. C                                                                               
  1306. 1504  IL = II+(KX-1)/2                                                          
  1307.       JL = JJ+(KY-1)/2                                                          
  1308.       IF(IL.LT.1.OR.IL.GE.M.OR.JL.LT.1.OR.JL.GE.N)                              
  1309.      &  GO TO IFOLLW,(101)                                                      
  1310.       KX = -KX                                                                  
  1311.       KY = -KY                                                                  
  1312.       DO 1505 ICT=1,3                                                           
  1313.       ITEMP = KX                                                                
  1314.       KX = -KY                                                                  
  1315.       KY = +ITEMP                                                               
  1316.       II = IL+(KX+1)/2                                                          
  1317.       JJ = JL+(KY+1)/2                                                          
  1318.       IF(LINK(1+IABS(KX),II,JJ)) GO TO 1601                                     
  1319. 1505  CONTINUE                                                                  
  1320.       GO TO IFOLLW,(101)                                                        
  1321. C                                                                               
  1322. C   FOLLOWING IS INTERNAL SUBROUTINE TO COMPUTE X AND Y                         
  1323. C COORDINATES OF THE POINT WHERE CONTOUR CROSSES THE LINK WHOSE                 
  1324. C INDICES ARE II AND JJ, WITH THE CROSSING IN THE DIRECTION DESIGNATED          
  1325. C BY KX AND KY.  THE LINK MARK ENTRY IS NOT CLEARED.                            
  1326. C                                                                               
  1327. 1601  XX = XA(1)+(II-1)*XA(2)                                                   
  1328.       YY = YA(1)+(JJ-1)*YA(2)                                                   
  1329.       ZZ = Z(II,JJ)                                                             
  1330.       IF(KX) 1620,1610,1620                                                     
  1331. 1610  X2 = XA(1)+II*XA(2)                                                       
  1332.       Z2 = Z(II+1,JJ)                                                           
  1333.       IF (Z2.NE.ZZ) XX = XX+(X2-XX)*((CLEV-ZZ)/(Z2-ZZ))                         
  1334.       GO TO IXY,(1502,1503)                                                     
  1335. 1620  Y2 = YA(1)+JJ*YA(2)                                                       
  1336.       Z2 = Z(II,JJ+1)                                                           
  1337.       IF (Z2.NE.ZZ) YY = YY+(Y2-YY)*((CLEV-ZZ)/(Z2-ZZ))                         
  1338.       GO TO IXY,(1502,1503)                                                     
  1339. C                                                                               
  1340. C     END OF INTERNAL SUBROUTINES                                               
  1341. 101   I = I+LY                                                                  
  1342. 102   J = J-LX                                                                  
  1343.       ITEMP = LX                                                                
  1344.       LX = -LY                                                                  
  1345. 103   LY = +ITEMP                                                               
  1346. C                                                                               
  1347. C   NOW DO CLOSED CONTOURS, WHICH ALL MUST EXIST ONLY IN INTERIOR OF            
  1348. C ARRAY.                                                                        
  1349. C                                                                               
  1350.       DO 132 J=1,NM1                                                            
  1351.       DO 132 I=1,MM1                                                            
  1352.       IF(.NOT.LINK(1,I,J)) GO TO 131                                            
  1353.       ASSIGN 131 TO IFOLLW                                                      
  1354.       LX = 0                                                                    
  1355.       LY = +1                                                                   
  1356.       GO TO 2501                                                                
  1357. 131   IF(.NOT.LINK(2,I,J)) GO TO 132                                            
  1358.       ASSIGN 132 TO IFOLLW                                                      
  1359.       LX = +1                                                                   
  1360.       LY = 0                                                                    
  1361.       GO TO 2501                                                                
  1362. C                                                                               
  1363. C   FOLLOWING IS INTERNAL SUBROUTINE TO FOLLOW A CONTOUR, CALLING               
  1364. C THE APPROPRIATE GRAPHICS ROUTINES AS IT GOES.  IT STARTS AT THE LINK          
  1365. C DESIGNATED BY I AND J, CROSSING IT IN THE DIRECTION INDICATED BY              
  1366. C LX AND LY.                                                                    
  1367. 2501  II = I                                                                    
  1368.       JJ = J                                                                    
  1369.       KX = LX                                                                   
  1370.       KY = LY                                                                   
  1371.       ASSIGN 2502 TO IXY                                                        
  1372.       GO TO 2601                                                                
  1373. 2502  CALL DRAWG(' ',XX,YY,ICTYPE,LWTYPE,0,1)                                   
  1374.       ASSIGN 2503 TO IXY                                                        
  1375.       GO TO 2504                                                                
  1376. 2503  CALL DRAWG(' ',XX,YY,ICTYPE,LWTYPE,0,2)                                   
  1377.       LINK(1+IABS(KX),II,JJ) = .FALSE.                                          
  1378. C                                                                               
  1379. C   IL AND JL ARE INDICES OF LL CORNER OF CELL WE ARE ENTERING                  
  1380. C                                                                               
  1381. 2504  IL = II+(KX-1)/2                                                          
  1382.       JL = JJ+(KY-1)/2                                                          
  1383.       IF(IL.LT.1.OR.IL.GE.M.OR.JL.LT.1.OR.JL.GE.N)                              
  1384.      &  GO TO IFOLLW,(131,132)                                                  
  1385.       KX = -KX                                                                  
  1386.       KY = -KY                                                                  
  1387.       DO 2505 ICT=1,3                                                           
  1388.       ITEMP = KX                                                                
  1389.       KX = -KY                                                                  
  1390.       KY = +ITEMP                                                               
  1391.       II = IL+(KX+1)/2                                                          
  1392.       JJ = JL+(KY+1)/2                                                          
  1393.       IF(LINK(1+IABS(KX),II,JJ)) GO TO 2601                                     
  1394. 2505  CONTINUE                                                                  
  1395.       GO TO IFOLLW,(131,132)                                                    
  1396. C                                                                               
  1397. C   FOLLOWING IS INTERNAL SUBROUTINE TO COMPUTE X AND Y                         
  1398. C COORDINATES OF THE POINT WHERE CONTOUR CROSSES THE LINK WHOSE                 
  1399. C INDICES ARE II AND JJ, WITH THE CROSSING IN THE DIRECTION DESIGNATED          
  1400. C BY KX AND KY.  THE LINK MARK ENTRY IS NOT CLEARED.                            
  1401. C                                                                               
  1402. 2601  XX = XA(1)+(II-1)*XA(2)                                                   
  1403.       YY = YA(1)+(JJ-1)*YA(2)                                                   
  1404.       ZZ = Z(II,JJ)                                                             
  1405.       IF(KX) 2620,2610,2620                                                     
  1406. 2610  X2 = XA(1)+II*XA(2)                                                       
  1407.       Z2 = Z(II+1,JJ)                                                           
  1408.       IF (Z2.NE.ZZ) XX = XX+(X2-XX)*((CLEV-ZZ)/(Z2-ZZ))                         
  1409.       GO TO IXY,(2502,2503)                                                     
  1410. 2620  Y2 = YA(1)+JJ*YA(2)                                                       
  1411.       Z2 = Z(II,JJ+1)                                                           
  1412.       IF (Z2.NE.ZZ) YY = YY+(Y2-YY)*((CLEV-ZZ)/(Z2-ZZ))                         
  1413.       GO TO IXY,(2502,2503)                                                     
  1414. C                                                                               
  1415. C     END OF INTERNAL SUBROUTINES                                               
  1416. 132   CONTINUE                                                                  
  1417. C                                                                               
  1418. C   END OF LEVEL LOOP                                                           
  1419. C                                                                               
  1420. 199   CONTINUE                                                                  
  1421.       RETURN                                                                    
  1422.       END                                                                       
  1423. *                                                                               
  1424. *****************************************************                           
  1425. * RASTRU -- INTERNAL RASTER SUBROUTINE                                          
  1426. *****************************************************                           
  1427. *                                                                               
  1428.       SUBROUTINE RASTRU(F,FMIN,FMAX,LX,LY,NX,NY,NXV,LWTYPE)                     
  1429. C THIS SUBROUTINE CONVERTS FLOATING POINT ARRAY TO COLOR RASTER IMAGE           
  1430. C SEVEN COLORS ARE USED TO CODE THE IMAGES.  RED, MAGENTA, YELLOW,              
  1431. C FOREGROUND, CYAN, GREEN, AND BLUE ARE USED IN GOING FROM HIGHEST TO           
  1432. C LOWEST VALUES.                                                                
  1433. C USING RASTER GRAPHICS                                                         
  1434.       DIMENSION F(NXV,NY)                                                       
  1435.       DIMENSION ICOLOR(7)                                                       
  1436.       SAVE NTC,ICOLOR                                                           
  1437.       DATA NTC /8/                                                              
  1438. C COLORS ARE: BLUE,GREEN,CYAN,FOREGROUND,YELLOW,MAGENTA,RED                     
  1439.       DATA ICOLOR /1,2,3,7,6,5,4/                                               
  1440.       LX1 = LX - 1                                                              
  1441.       LY1 = LY - 1                                                              
  1442.       DXG = FLOAT(NX - 1)/FLOAT(LX1)                                            
  1443.       DYG = FLOAT(NY - 1)/FLOAT(LY1)                                            
  1444.       AF = FLOAT(NTC - 1)/(FMAX - FMIN)                                         
  1445. C LOOP OVER PIXELS                                                              
  1446.       DO 40 K = 1, LY1                                                          
  1447.       Y = FLOAT(K - 1)                                                          
  1448.       YT = Y*DYG + 1.                                                           
  1449.       M = YT                                                                    
  1450.       DY = YT - FLOAT(M)                                                        
  1451.       DYT = 1. - DY                                                             
  1452.       DO 20 J = 1, LX1                                                          
  1453.       X = FLOAT(J - 1)                                                          
  1454.       XT = X*DXG + 1.                                                           
  1455.       N = XT                                                                    
  1456.       DX = XT - FLOAT(N)                                                        
  1457.       DXT = 1. - DX                                                             
  1458.       FC = F(N,M)*DXT*DYT + F(N+1,M)*DX*DYT + F(N,M+1)*DXT*DY + F(N+1,M+        
  1459.      11)*DX*DY                                                                  
  1460.       ICTYPE = 0                                                                
  1461.       IF ((FC.LT.FMIN).OR.(FC.GT.FMAX)) GO TO 10                                
  1462.       IC = (FC - FMIN)*AF                                                       
  1463.       IF (IC.EQ.NTC) IC = NTC - 1                                               
  1464.       ICTYPE = ICOLOR(IC+1) + 8                                                 
  1465.    10 CALL DRAWG(' ',X,Y,ICTYPE,LWTYPE,0,3)                                     
  1466.    20 CONTINUE                                                                  
  1467.       FC = F(NX,M)*DYT + F(NX,M+1)*DY                                           
  1468.       ICTYPE = 0                                                                
  1469.       IF ((FC.LT.FMIN).OR.(FC.GT.FMAX)) GO TO 30                                
  1470.       IC = (FC - FMIN)*AF                                                       
  1471.       IF (IC.EQ.NTC) IC = NTC - 1                                               
  1472.       ICTYPE = ICOLOR(IC+1) + 8                                                 
  1473.    30 CALL DRAWG(' ',X,Y,ICTYPE,LWTYPE,0,3)                                     
  1474.    40 CONTINUE                                                                  
  1475.       FC = F(NX,NY)                                                             
  1476.       ICTYPE = 0                                                                
  1477.       IF ((FC.LT.FMIN).OR.(FC.GT.FMAX)) GO TO 50                                
  1478.       IC = (FC - FMIN)*AF                                                       
  1479.       IF (IC.EQ.NTC) IC = NTC - 1                                               
  1480.       ICTYPE = ICOLOR(IC+1) + 8                                                 
  1481.    50 CALL DRAWG(' ',X,Y,ICTYPE,LWTYPE,0,3)                                     
  1482.       RETURN                                                                    
  1483.       END                                                                       
  1484. *                                                                               
  1485. *****************************************************                           
  1486. * INITGR -- INITIALIZE GRAPHICS PARAMETERS                                      
  1487. *****************************************************                           
  1488. *                                                                               
  1489.       SUBROUTINE INITGR(IRX,IRY,ICH,ICW)                                        
  1490. C THIS SUBROUTINE INITIALIZES GRAPHICS PARAMETERS                               
  1491. C DEFAULT SCALING                                                               
  1492.       CALL SELFMP(IRX,IRY)                                                      
  1493. C DEFAULT CHARACTER SIZE                                                        
  1494.       CALL CHARSZ(ICH,ICW)                                                      
  1495. C SET CURSOR TO ZERO                                                            
  1496.       CALL DRAWG(' ',0.,0.,0,0,0,1)                                             
  1497. C CLEAR IMAGE                                                                   
  1498.       CALL DRAWG(' ',0.,0.,0,0,0,0)                                             
  1499.       RETURN                                                                    
  1500.       END                                                                       
  1501.       SUBROUTINE DRLINS (X,Y,N,IC,LWTYPE)                                       
  1502. C THIS SUBROUTINE DRAWS LINES                                                   
  1503.       DIMENSION X(N), Y(N)                                                      
  1504.       CALL DRAWG(' ',X(1),Y(1),IC,LWTYPE,0,1)                                   
  1505.       DO 10 J = 1, N                                                            
  1506.       CALL DRAWG(' ',X(J),Y(J),IC,LWTYPE,0,2)                                   
  1507.    10 CONTINUE                                                                  
  1508.       RETURN                                                                    
  1509.       END                                                                       
  1510. *                                                                               
  1511. *****************************************************                           
  1512. * DRPNTS -- DRAW POINTS                                                         
  1513. *****************************************************                           
  1514. *                                                                               
  1515.       SUBROUTINE DRPNTS (X,Y,N,IC,LWTYPE)                                       
  1516. C THIS SUBROUTINE DRAWS POINTS                                                  
  1517.       DIMENSION X(N), Y(N)                                                      
  1518.       DO 10 J = 1, N                                                            
  1519.       CALL DRAWG(' ',X(J),Y(J),IC,LWTYPE,0,3)                                   
  1520.    10 CONTINUE                                                                  
  1521.       RETURN                                                                    
  1522.       END                                                                       
  1523. *                                                                               
  1524. *****************************************************                           
  1525. * DRSHLS -- DRAW DASHED LINES                                                   
  1526. *****************************************************                           
  1527. *                                                                               
  1528.       SUBROUTINE DRSHLS (X,Y,N,IC,LWTYPE,L)                                     
  1529. C THIS SUBROUTINE DRAWS DASHED LINES                                            
  1530.       DIMENSION X(N), Y(N)                                                      
  1531.       CALL DRAWG(' ',X(1),Y(1),IC,LWTYPE,L,1)                                   
  1532.       DO 10 J = 1, N                                                            
  1533.       CALL DRAWG(' ',X(J),Y(J),IC,LWTYPE,L,4)                                   
  1534.    10 CONTINUE                                                                  
  1535.       RETURN                                                                    
  1536.       END                                                                       
  1537. *                                                                               
  1538. *****************************************************                           
  1539. * DRSTRG -- DRAW CHARACTER STRING                                               
  1540. *****************************************************                           
  1541. *                                                                               
  1542.       SUBROUTINE DRSTRG(CHR,AX,AY,IC,LWTYPE,ICW,NCR)                            
  1543. C THIS SUBROUTINE DRAWS CHARACTER STRING OF LENGTH NCR                          
  1544.       CHARACTER*(*) CHR                                                         
  1545.       DX = FLOAT(ICW)                                                           
  1546.       IF (NCR.EQ.0) GO TO 20                                                    
  1547.       DO 10 I = 1, NCR                                                          
  1548.       AT1 = AX + DX*FLOAT(I - 1)                                                
  1549.       CALL DRAWG(CHR(I:I),AT1,AY,IC,LWTYPE,0,5)                                 
  1550.    10 CONTINUE                                                                  
  1551.    20 RETURN                                                                    
  1552.       END                                                                       
  1553. *                                                                               
  1554. *****************************************************                           
  1555. * GRIDL -- DRAW TICKS AND/OR GRIDS                                              
  1556. *****************************************************                           
  1557. *                                                                               
  1558.       SUBROUTINE GRIDL (XMX,XMN,YMX,YMN,ISTCX,ISTCY,NTX,NTY,IC,LWTYPE,IS        
  1559.      1TYLE)                                                                     
  1560. C THIS SUBROUTINE DRAWS TICKS AND/OR GRIDS ON GRAPH WITH LINES                  
  1561. C ISTYLE = (0,1,2) = DRAW (BOX,TICKS,TICKS AND GRID)                            
  1562. C DRAW TICKS IN Y DIRECTION                                                     
  1563.       IT1 = NTY + 1                                                             
  1564.       STX = FLOAT(ISTCX)                                                        
  1565.       AT1 = XMN - STX                                                           
  1566.       AT2 = XMX + STX                                                           
  1567.       DYT = (YMX - YMN)/FLOAT(NTY)                                              
  1568.       DO 20 J = 1, IT1                                                          
  1569.       AY = DYT*FLOAT(J - 1) + YMN                                               
  1570.       CALL DRAWG(' ',AT1,AY,IC,LWTYPE,0,1)                                      
  1571.       IF ((J.EQ.1).OR.(J.EQ.IT1)) GO TO 10                                      
  1572.       IF (ISTYLE.EQ.0) GO TO 20                                                 
  1573.       CALL DRAWG(' ',XMN,AY,IC,LWTYPE,0,4)                                      
  1574.       IF (ISTYLE.EQ.1) CALL DRAWG(' ',XMX,AY,IC,LWTYPE,0,1)                     
  1575.       IF (ISTYLE.EQ.2) CALL DRAWG(' ',XMX,AY,IC,LWTYPE,1,4)                     
  1576.    10 CALL DRAWG(' ',AT2,AY,IC,LWTYPE,0,4)                                      
  1577.    20 CONTINUE                                                                  
  1578. C DRAW TICKS IN X DIRECTION                                                     
  1579.       IT1 = NTX + 1                                                             
  1580.       STY = FLOAT(ISTCY)                                                        
  1581.       AT1 = YMN - STY                                                           
  1582.       AT2 = YMX + STY                                                           
  1583.       DXT = (XMX - XMN)/FLOAT(NTX)                                              
  1584.       DO 40 J = 1, IT1                                                          
  1585.       AX = DXT*FLOAT(J - 1) + XMN                                               
  1586.       CALL DRAWG(' ',AX,AT1,IC,LWTYPE,0,1)                                      
  1587.       IF ((J.EQ.1).OR.(J.EQ.IT1)) GO TO 30                                      
  1588.       IF (ISTYLE.EQ.0) GO TO 40                                                 
  1589.       CALL DRAWG(' ',AX,YMN,IC,LWTYPE,0,4)                                      
  1590.       IF (ISTYLE.EQ.1) CALL DRAWG(' ',AX,YMX,IC,LWTYPE,0,1)                     
  1591.       IF (ISTYLE.EQ.2) CALL DRAWG(' ',AX,YMX,IC,LWTYPE,1,4)                     
  1592.    30 CALL DRAWG(' ',AX,AT2,IC,LWTYPE,0,4)                                      
  1593.    40 CONTINUE                                                                  
  1594.       RETURN                                                                    
  1595.       END                                                                       
  1596. *                                                                               
  1597. *****************************************************                           
  1598. * GRIDG  -- DRAW TICKS AND/OR GRIDS                                             
  1599. *****************************************************                           
  1600. *                                                                               
  1601.       SUBROUTINE GRIDG (XMX,XMN,YMX,YMN,ICH,ICW,ISTCX,ISTCY,NTX,NTY,IC,L        
  1602.      1WTYPE,ISTYLE)                                                             
  1603. C THIS SUBROUTINE DRAWS TICKS AND/OR GRIDS ON GRAPH WITH CHARACTERS             
  1604. C ISTYLE = (0,1,2) = DRAW (BOX,TICKS,TICKS AND GRID)                            
  1605.       DX = FLOAT(ICW)                                                           
  1606.       DY = FLOAT(ICH)                                                           
  1607.       DXH = FLOAT(ICW/2)                                                        
  1608.       DYH = FLOAT(ICH/2)                                                        
  1609.       DXT = (XMX - XMN)/FLOAT(NTX)                                              
  1610.       DYT = (YMX - YMN)/FLOAT(NTY)                                              
  1611.       NCRX = (XMX - XMN)/DX + 1.5                                               
  1612.       NCRY = (YMX - YMN)/DY + 1.5                                               
  1613.       DX = (XMX - XMN)/FLOAT(NCRX - 1)                                          
  1614.       DY = (YMX - YMN)/FLOAT(NCRY - 1)                                          
  1615. C DRAW TICKS IN Y DIRECTION                                                     
  1616.       IT1 = NTY + 1                                                             
  1617.       STX = FLOAT(ISTCX)                                                        
  1618.       AT1 = XMN - STX                                                           
  1619.       AT2 = XMX + STX                                                           
  1620.       NCRT = STX/DX + .5                                                        
  1621.       DO 70 J = 1, IT1                                                          
  1622.       IN = 1                                                                    
  1623.       IF ((J.EQ.1).OR.(J.EQ.IT1)) IN = 0                                        
  1624.       IY = DYT*FLOAT(J - 1)/DY + .5                                             
  1625.       AY = DY*FLOAT(IY) + YMN - DYH                                             
  1626. C EXTERIOR LEFT TICKS                                                           
  1627.       IF ((IN.EQ.1).AND.(ISTYLE.EQ.0)) GO TO 20                                 
  1628.       DO 10 I = 1, NCRT                                                         
  1629.       AT3 = AT1 + DX*FLOAT(I - 1) - DXH                                         
  1630.       CALL DRAWG('-',AT3,AY,IC,LWTYPE,0,5)                                      
  1631.    10 CONTINUE                                                                  
  1632. C GRIDS AND INTERIOR TICKS                                                      
  1633.    20 AX = DXT                                                                  
  1634.       IX = AX/DX + .5                                                           
  1635.       DO 50 I = 1, NCRX                                                         
  1636.       I1 = I - 1                                                                
  1637.       AT3 = XMN + DX*FLOAT(I1) - DXH                                            
  1638.       IF ((I.EQ.1).OR.(I.EQ.NCRX)) GO TO 40                                     
  1639.       IF ((IN.EQ.1).AND.(ISTYLE.LE.1)) GO TO 50                                 
  1640.       IF ((ISTYLE.GT.0).AND.(I1.EQ.IX)) GO TO 30                                
  1641.       CALL DRAWG('-',AT3,AY,IC,LWTYPE,0,5)                                      
  1642.       GO TO 50                                                                  
  1643.    30 AX = AX + DXT                                                             
  1644.       IX = AX/DX + .5                                                           
  1645.    40 CALL DRAWG('+',AT3,AY,IC,LWTYPE,0,5)                                      
  1646.    50 CONTINUE                                                                  
  1647. C EXTERIOR RIGHT TICKS                                                          
  1648.       IF ((IN.EQ.1).AND.(ISTYLE.EQ.0)) GO TO 70                                 
  1649.       DO 60 I = 1, NCRT                                                         
  1650.       AT3 = XMX + DX*FLOAT(I) - DXH                                             
  1651.       CALL DRAWG('-',AT3,AY,IC,LWTYPE,0,5)                                      
  1652.    60 CONTINUE                                                                  
  1653.    70 CONTINUE                                                                  
  1654. C DRAW TICKS IN X DIRECTION                                                     
  1655.       IT1 = NTX + 1                                                             
  1656.       STY = FLOAT(ISTCY)                                                        
  1657.       AT1 = YMN - STY                                                           
  1658.       AT2 = YMX + STY                                                           
  1659.       NCRT = STY/DY + .5                                                        
  1660.       DO 130 J = 1, IT1                                                         
  1661.       IN = 1                                                                    
  1662.       IF ((J.EQ.1).OR.(J.EQ.IT1)) IN = 0                                        
  1663.       IX = DXT*FLOAT(J - 1)/DX + .5                                             
  1664.       AX = DX*FLOAT(IX) + XMN - DXH                                             
  1665. C EXTERIOR BOTTOM TICKS                                                         
  1666.       IF ((IN.EQ.1).AND.(ISTYLE.EQ.0)) GO TO 90                                 
  1667.       DO 80 I = 1, NCRT                                                         
  1668.       AT3 = AT1 + DY*FLOAT(I - 1) - DYH                                         
  1669.       CALL DRAWG('|',AX,AT3,IC,LWTYPE,0,5)                                      
  1670.    80 CONTINUE                                                                  
  1671. C GRIDS AND INTERIOR TICKS                                                      
  1672.    90 AY = DYT                                                                  
  1673.       IY = AY/DY + .5                                                           
  1674.       DO 110 I = 1, NCRY                                                        
  1675.       I1 = I - 1                                                                
  1676.       AT3 = YMN + DY*FLOAT(I1) - DYH                                            
  1677.       IF ((I.EQ.1).OR.(I.EQ.NCRY)) GO TO 110                                    
  1678.       IF ((IN.EQ.1).AND.(ISTYLE.LE.1)) GO TO 110                                
  1679.       IF ((ISTYLE.GT.0).AND.(I1.EQ.IY)) GO TO 100                               
  1680.       CALL DRAWG('|',AX,AT3,IC,LWTYPE,0,5)                                      
  1681.       GO TO 110                                                                 
  1682.   100 AY = AY + DYT                                                             
  1683.       IY = AY/DY + .5                                                           
  1684.   110 CONTINUE                                                                  
  1685. C EXTERIOR TOP TICKS                                                            
  1686.       IF ((IN.EQ.1).AND.(ISTYLE.EQ.0)) GO TO 130                                
  1687.       DO 120 I = 1, NCRT                                                        
  1688.       AT3 = YMX + DY*FLOAT(I) - DYH                                             
  1689.       CALL DRAWG('|',AX,AT3,IC,LWTYPE,0,5)                                      
  1690.   120 CONTINUE                                                                  
  1691.   130 CONTINUE                                                                  
  1692.       RETURN                                                                    
  1693.       END                                                                       
  1694. *                                                                               
  1695. *****************************************************                           
  1696. * BOXL   -- DRAW BOX AROUND GRAPH WITH LINES                                    
  1697. *****************************************************                           
  1698. *                                                                               
  1699.       SUBROUTINE BOXL (XMX,XMN,YMX,YMN,IC,LWTYPE)                               
  1700. C THIS SUBROUTINE DRAWS BOX AROUND GRAPH WITH LINES                             
  1701.       CALL DRAWG(' ',XMN,YMN,IC,LWTYPE,0,1)                                     
  1702.       CALL DRAWG(' ',XMX,YMN,IC,LWTYPE,0,2)                                     
  1703.       CALL DRAWG(' ',XMX,YMX,IC,LWTYPE,0,2)                                     
  1704.       CALL DRAWG(' ',XMN,YMX,IC,LWTYPE,0,2)                                     
  1705.       CALL DRAWG(' ',XMN,YMN,IC,LWTYPE,0,2)                                     
  1706.       RETURN                                                                    
  1707.       END                                                                       
  1708. *                                                                               
  1709. *****************************************************                           
  1710. * BOXG   -- DRAW BOX AROUND GRAPH WITH CHARACTERS                               
  1711. *****************************************************                           
  1712. *                                                                               
  1713.       SUBROUTINE BOXG (XMX,XMN,YMX,YMN,ICH,ICW,IC,LWTYPE)                       
  1714. C THIS SUBROUTINE DRAWS BOX AROUND GRAPH WITH CHARACTERS                        
  1715.       DX = FLOAT(ICW)                                                           
  1716.       DY = FLOAT(ICH)                                                           
  1717.       DXH = FLOAT(ICW/2)                                                        
  1718.       DYH = FLOAT(ICH/2)                                                        
  1719.       NCRX = (XMX - XMN)/DX + 1.5                                               
  1720.       NCRY = (YMX - YMN)/DY + 1.5                                               
  1721.       DX = (XMX - XMN)/FLOAT(NCRX - 1)                                          
  1722.       DY = (YMX - YMN)/FLOAT(NCRY - 1)                                          
  1723. C DRAWS LINES IN X DIRECTION                                                    
  1724.       AT2 = YMN - DYH                                                           
  1725.       AT3 = YMX - DYH                                                           
  1726.       DO 20 I = 1, NCRX                                                         
  1727.       AT1 = XMN + DX*FLOAT(I - 1) - DXH                                         
  1728.       IF ((I.EQ.1).OR.(I.EQ.NCRX)) GO TO 10                                     
  1729.       CALL DRAWG('-',AT1,AT2,IC,LWTYPE,0,5)                                     
  1730.       CALL DRAWG('-',AT1,AT3,IC,LWTYPE,0,5)                                     
  1731.       GO TO 20                                                                  
  1732.    10 CALL DRAWG('+',AT1,AT2,IC,LWTYPE,0,5)                                     
  1733.       CALL DRAWG('+',AT1,AT3,IC,LWTYPE,0,5)                                     
  1734.    20 CONTINUE                                                                  
  1735. C DRAWS LINES IN Y DIRECTION                                                    
  1736.       AT2 = XMN - DXH                                                           
  1737.       AT3 = XMX - DXH                                                           
  1738.       DO 30 I = 1, NCRY                                                         
  1739.       IF ((I.EQ.1).OR.(I.EQ.NCRY)) GO TO 30                                     
  1740.       AT1 = YMN + DY*FLOAT(I - 1) - DYH                                         
  1741.       CALL DRAWG('|',AT2,AT1,IC,LWTYPE,0,5)                                     
  1742.       CALL DRAWG('|',AT3,AT1,IC,LWTYPE,0,5)                                     
  1743.    30 CONTINUE                                                                  
  1744.       RETURN                                                                    
  1745.       END                                                                       
  1746. *                                                                               
  1747. *****************************************************                           
  1748. * SGRAPH -- WRITES OUT PLOT TO DEVICE                                           
  1749. *****************************************************                           
  1750. *                                                                               
  1751.       SUBROUTINE SGRAPH                                                         
  1752. C THIS SUBROUTINE WRITES OUT PLOT TO DEVICE                                     
  1753.       CALL DRAWG(' ',0.,0.,0,0,0,6)                                             
  1754.       RETURN                                                                    
  1755.       END                                                                       
  1756. *                                                                               
  1757. *****************************************************                           
  1758. * READC                                                                         
  1759. *****************************************************                           
  1760. *                                                                               
  1761.       SUBROUTINE READC(IRC)                                                     
  1762.       CHARACTER*1 C                                                             
  1763.       CHARACTER*8 CX                                                            
  1764.       CHARACTER*37 CHR1                                                         
  1765.       CHARACTER*13 CHR2                                                         
  1766.    91 FORMAT (1X,A37)                                                           
  1767.    92 FORMAT (1X,A13)                                                           
  1768.       DATA CHR1 /' Q=QUIT, S=SAVE, M=MODIFY, R=REVERSE '/                       
  1769.       DATA CHR2 /' CR=CONTINUE '/                                               
  1770.       IRC = 0                                                                   
  1771.    10 CALL CINPUT(CX)                                                           
  1772.       C = CX(1:1)                                                               
  1773.       IF (C.NE.'?') GO TO 20                                                    
  1774.       CALL CLEAR                                                                
  1775.       WRITE (6,91) CHR1                                                         
  1776.       WRITE (6,92) CHR2                                                         
  1777.       GO TO 10                                                                  
  1778.    20 IF ((C.EQ.'Q').OR.(C.EQ.'q')) IRC = 1                                     
  1779.       IF ((C.EQ.'S').OR.(C.EQ.'s')) IRC = 2                                     
  1780.       IF ((C.EQ.'M').OR.(C.EQ.'m')) IRC = 3                                     
  1781.       IF ((C.EQ.'R').OR.(C.EQ.'r')) IRC = 4                                     
  1782.       RETURN                                                                    
  1783.       END                                                                       
  1784. *                                                                               
  1785. *****************************************************                           
  1786. * WPARAM --                                                                     
  1787. *****************************************************                           
  1788. *                                                                               
  1789.       SUBROUTINE WPARAM (RUNID,INDX,MOVION,NPX,NPXB,T0,TEND,DT,AX,VTX,ED        
  1790.      1GE,RMASS,RTEMP,VDX,VTDX,IBCS,BVL,BVR,NUSTRT,NTR,NTI,NPP,NTW,NTT,NP        
  1791.      2ROBT,NDIST,NTP,MODES,NDP,NTV,NMV,NXB,NPRS,NPRO,NDV,NTD,MODED,NDD,A        
  1792.      3NLE,ANSE,AMODEN,FREQN,ANLI,ANSI,AMODEX,FREQ,TRMP,TOFF,QME,QMI,QMB,        
  1793.      4QTEST,VTEST,X0,CI,IRC)                                                    
  1794.       CHARACTER*128 CHR                                                         
  1795.       CHARACTER*8 RUNID                                                         
  1796.   901 FORMAT (8H RUNID= ,A8)                                                    
  1797.   902 FORMAT (6H INDX=,I3,5H NPX=,I8,5H VTX=,F10.7,4H CI=,F8.4,5H QME=,F        
  1798.      18.4)                                                                      
  1799.   903 FORMAT (6H IBCS=,I2,5H BVL=,F14.7,5H BVR=,F14.7)                          
  1800.   904 FORMAT (4H T0=,F8.1,6H TEND=,F8.1,4H DT=,F8.5)                            
  1801.   905 FORMAT (8H MOVION=,I2,7H RMASS=,F14.7,7H RTEMP=,F14.7,5H QMI=,F8.4        
  1802.      1)                                                                         
  1803.   906 FORMAT (6H NPXB=,I8,5H VDX=,F10.7,6H VTDX=,F10.7,5H QMB=,F8.4)            
  1804.   907 FORMAT (5H NPP=,I6,5H NTI=,I4,4H AX=,F8.5,6H EDGE=,F8.5)                  
  1805.   908 FORMAT (8H NUSTRT=,I2,5H NTR=,I6)                                         
  1806.   909 FORMAT (5H NTW=,I6)                                                       
  1807.   910 FORMAT (5H NTT=,I6,8H NPROBT=,I8,7H NDIST=,I5)                            
  1808.   911 FORMAT (5H NTP=,I6,7H MODES=,I5,5H NDP=,I6)                               
  1809.   912 FORMAT (5H NTV=,I6,5H NMV=,I5,5H NXB=,I4,6H NPRS=,I3,6H NPRO=,I3,5        
  1810.      1H NDV=,I6)                                                                
  1811.   913 FORMAT (5H NTD=,I6,7H MODED=,I5,5H NDD=,I6)                               
  1812.   914 FORMAT (6H ANLE=,F14.7,6H ANSE=,F14.7)                                    
  1813.   915 FORMAT (8H AMODEN=,F8.3,7H FREQN=,F14.7)                                  
  1814.   916 FORMAT (6H ANLI=,F14.7,6H ANSI=,F14.7)                                    
  1815.   917 FORMAT (8H AMODEX=,F8.3,6H FREQ=,F14.7,6H TRMP=,F8.1,6H TOFF=,F8.1        
  1816.      1)                                                                         
  1817.   918 FORMAT (7H QTEST=,F11.5,7H VTEST=,F5.2,4H X0=,F8.1)                       
  1818.       SAVE LW,IC                                                                
  1819.       DATA LW,IC /1,7/                                                          
  1820.       IRC = 0                                                                   
  1821.       CALL GRPARM(3,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  1822.      1,NTCX,NTCY,IGSTYL)                                                        
  1823.       CALL INITGR(IRX,IRY,ICH,ICW)                                              
  1824.       AT1 = FLOAT(ICH + ICH/3)                                                  
  1825.       AX = FLOAT(MINX)                                                          
  1826.       WRITE (CHR,901) RUNID                                                     
  1827.       AY = FLOAT(MINY + LENY) - AT1                                             
  1828.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,16)                                       
  1829.       WRITE (CHR,902) INDX, NPX, VTX, CI, QME                                   
  1830.       AY = AY - AT1                                                             
  1831.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,62)                                       
  1832.       WRITE (CHR,903) IBCS, BVL, BVR                                            
  1833.       AY = AY - AT1                                                             
  1834.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,46)                                       
  1835.       WRITE (CHR,904) T0, TEND, DT                                              
  1836.       AY = AY - AT1                                                             
  1837.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,38)                                       
  1838.       WRITE (CHR,905) MOVION, RMASS, RTEMP, QMI                                 
  1839.       AY = AY - AT1                                                             
  1840.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,65)                                       
  1841.       WRITE (CHR,906) NPXB, VDX, VTDX, QMB                                      
  1842.       AY = AY - AT1                                                             
  1843.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,58)                                       
  1844.       WRITE (CHR,907) NPP, NTI, AX, EDGE                                        
  1845.       AY = AY - AT1                                                             
  1846.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,46)                                       
  1847.       WRITE (CHR,908) NUSTRT, NTR                                               
  1848.       AY = AY - AT1                                                             
  1849.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,21)                                       
  1850.       WRITE (CHR,909) NTW                                                       
  1851.       AY = AY - AT1                                                             
  1852.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,11)                                       
  1853.       WRITE (CHR,910) NTT, NPROBT, NDIST                                        
  1854.       AY = AY - AT1                                                             
  1855.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,39)                                       
  1856.       WRITE (CHR,911) NTP, MODES, NDP                                           
  1857.       AY = AY - AT1                                                             
  1858.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,34)                                       
  1859.       WRITE (CHR,912) NTV, NMV, NXB, NPRS, NPRO, NDV                            
  1860.       AY = AY - AT1                                                             
  1861.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,60)                                       
  1862.       WRITE (CHR,913) NTD, MODED, NDD                                           
  1863.       AY = AY - AT1                                                             
  1864.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,34)                                       
  1865.       WRITE (CHR,914) ANLE, ANSE                                                
  1866.       AY = AY - AT1                                                             
  1867.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,40)                                       
  1868.       WRITE (CHR,915) AMODEN, FREQN                                             
  1869.       AY = AY - AT1                                                             
  1870.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,37)                                       
  1871.       WRITE (CHR,916) ANLI, ANSI                                                
  1872.       AY = AY - AT1                                                             
  1873.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,40)                                       
  1874.       WRITE (CHR,917) AMODEX, FREQ, TRMP, TOFF                                  
  1875.       AY = AY - AT1                                                             
  1876.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,64)                                       
  1877.       WRITE (CHR,918) QTEST, VTEST, X0                                          
  1878.       AY = AY - AT1                                                             
  1879.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,42)                                       
  1880.       CALL SGRAPH                                                               
  1881.       CALL READC(IRC)                                                           
  1882.       RETURN                                                                    
  1883.       END                                                                       
  1884. *                                                                               
  1885. *****************************************************                           
  1886. * WPCORR                                                                        
  1887. *****************************************************                           
  1888. *                                                                               
  1889.       SUBROUTINE WPCORR (RUNID,INDX,NTP,MODES,IBCS,T0,TEND,DT,CENG,LTS,I        
  1890.      1TS,NTS,KMIN,KMAX,NTD,NTC,WMIN,WMAX,DW,IRC)                                
  1891.       CHARACTER*128 CHR                                                         
  1892.       CHARACTER*8 RUNID                                                         
  1893.   900 FORMAT (39H SPECTRUM ANALYSIS FOR 1D PERIODIC DATA)                       
  1894.   901 FORMAT (8H RUNID= ,A8,6H INDX=,I3,5H NTP=,I6,7H MODES=,I5,6H IBCS=        
  1895.      1,I2)                                                                      
  1896.   902 FORMAT (4H T0=,F8.1,6H TEND=,F8.1,4H DT=,F8.5,6H CENG=,E14.7)             
  1897.   903 FORMAT (5H LTS=,I6,5H ITS=,I6, 5H NTS=,I6)                                
  1898.   904 FORMAT (6H KMIN=,I6,6H KMAX=,I6)                                          
  1899.   905 FORMAT (5H NTD=,I6,5H NTC=,I6)                                            
  1900.   906 FORMAT (6H WMIN=,F8.4,6H WMAX=,F8.4,4H DW=,F8.4)                          
  1901.       SAVE LW,IC                                                                
  1902.       DATA LW,IC /1,7/                                                          
  1903.       IRC = 0                                                                   
  1904.       CALL GRPARM(3,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  1905.      1,NTCX,NTCY,IGSTYL)                                                        
  1906.       CALL INITGR(IRX,IRY,ICH,ICW)                                              
  1907.       AT1 = FLOAT(ICH + ICH/3)                                                  
  1908.       AX = FLOAT(MINX)                                                          
  1909.       WRITE (CHR,900)                                                           
  1910.       AY = FLOAT(MINY + LENY) - 2.*AT1                                          
  1911.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,39)                                       
  1912.       WRITE (CHR,901) RUNID, INDX, NTP, MODES, IBCS                             
  1913.       AY = AY - AT1                                                             
  1914.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,56)                                       
  1915.       WRITE (CHR,902) T0, TEND, DT, CENG                                        
  1916.       AY = AY - AT1                                                             
  1917.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,58)                                       
  1918.       WRITE (CHR,903) LTS, ITS, NTS                                             
  1919.       AY = AY - AT1                                                             
  1920.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,33)                                       
  1921.       WRITE (CHR,904) KMIN, KMAX                                                
  1922.       AY = AY - AT1                                                             
  1923.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,24)                                       
  1924.       WRITE (CHR,905) NTD, NTC                                                  
  1925.       AY = AY - AT1                                                             
  1926.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,22)                                       
  1927.       WRITE (CHR,906) WMIN, WMAX, DW                                            
  1928.       AY = AY - AT1                                                             
  1929.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,40)                                       
  1930.       CALL SGRAPH                                                               
  1931.       CALL READC(IRC)                                                           
  1932.       RETURN                                                                    
  1933.       END                                                                       
  1934. *                                                                               
  1935. *****************************************************                           
  1936. * WPCLDS                                                                        
  1937. *****************************************************                           
  1938. *                                                                               
  1939.       SUBROUTINE WPCLDS (RUNID,INDX,NTP,MODES,IBCS,T0,TEND,DT,CENG,VTEST        
  1940.      1,QTEST,NP,LTS,ITS,NTS,MTS,NXD,NXS,LAB,IRC)                                
  1941.       CHARACTER*128 CHR                                                         
  1942.       CHARACTER*8 RUNID                                                         
  1943.   900 FORMAT (38H DISPLAY SUBTRACTED DATA FOR 1D CLOUDS)                        
  1944.   901 FORMAT (8H RUNID= ,A8,6H INDX=,I3,5H NTP=,I6,7H MODES=,I5,6H IBCS=        
  1945.      1,I2)                                                                      
  1946.   902 FORMAT (4H T0=,F8.1,6H TEND=,F8.1,4H DT=,F8.5,6H CENG=,E14.7)             
  1947.   903 FORMAT (9H VTEST = ,F5.2,9H QTEST = ,F11.5,6H NP = ,I8)                   
  1948.   904 FORMAT (5H LTS=,I6,5H ITS=,I6,5H NTS=,I6,5H MTS=,I6)                      
  1949.   905 FORMAT (5H LAB=,I6,5H NXD=,I6,5H NXS=,I6)                                 
  1950.       SAVE LW,IC                                                                
  1951.       DATA LW,IC /1,7/                                                          
  1952.       IRC = 0                                                                   
  1953.       CALL GRPARM(3,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  1954.      1,NTCX,NTCY,IGSTYL)                                                        
  1955.       CALL INITGR(IRX,IRY,ICH,ICW)                                              
  1956.       AT1 = FLOAT(ICH + ICH/3)                                                  
  1957.       AX = FLOAT(MINX)                                                          
  1958.       WRITE (CHR,900)                                                           
  1959.       AY = FLOAT(MINY + LENY) - 2.*AT1                                          
  1960.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,38)                                       
  1961.       WRITE (CHR,901) RUNID, INDX, NTP, MODES, IBCS                             
  1962.       AY = AY - AT1                                                             
  1963.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,56)                                       
  1964.       WRITE (CHR,902) T0, TEND, DT, CENG                                        
  1965.       AY = AY - AT1                                                             
  1966.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,58)                                       
  1967.       WRITE (CHR,903) VTEST, QTEST, NP                                          
  1968.       AY = AY - AT1                                                             
  1969.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,48)                                       
  1970.       WRITE (CHR,904) LTS, ITS, NTS, MTS                                        
  1971.       AY = AY - AT1                                                             
  1972.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,44)                                       
  1973.       WRITE (CHR,905) LAB, NXD, NXS                                             
  1974.       AY = AY - AT1                                                             
  1975.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,33)                                       
  1976.       CALL SGRAPH                                                               
  1977.       CALL READC(IRC)                                                           
  1978.       RETURN                                                                    
  1979.       END                                                                       
  1980. *                                                                               
  1981. *****************************************************                           
  1982. * WPPRFL                                                                        
  1983. *****************************************************                           
  1984. *                                                                               
  1985.       SUBROUTINE WPPRFL (RUNID,INDX,MOVION,NTV,NPRS,NPRO,T0,TEND,DT,RMAS        
  1986.      1S,LTS,ITS,NTS,MTS,IDS,NDS,ION,IFL,IRC)                                    
  1987.       CHARACTER*128 CHR                                                         
  1988.       CHARACTER*8 RUNID                                                         
  1989.   900 FORMAT (37H DISPLAY SPATIAL PROFILES FOR 1D DATA)                         
  1990.   901 FORMAT (8H RUNID= ,A8,6H INDX=,I3,8H MOVION=,I2,5H NTV=,I6,6H NPRS        
  1991.      1=,I3,6H NPRO=,I3)                                                         
  1992.   902 FORMAT (4H T0=,F8.1,6H TEND=,F8.1,4H DT=,F8.5,7H RMASS=,F14.7)            
  1993.   903 FORMAT (5H LTS=,I6,5H ITS=,I6,5H NTS=,I6,5H MTS=,I6)                      
  1994.   904 FORMAT (5H IDS=,I6,5H NDS=,I6,5H ION=,I6,5H IFL=,I6)                      
  1995.       SAVE LW,IC                                                                
  1996.       DATA LW,IC /1,7/                                                          
  1997.       IRC = 0                                                                   
  1998.       CALL GRPARM(3,IRX,IRY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY        
  1999.      1,NTCX,NTCY,IGSTYL)                                                        
  2000.       CALL INITGR(IRX,IRY,ICH,ICW)                                              
  2001.       AT1 = FLOAT(ICH + ICH/3)                                                  
  2002.       AX = FLOAT(MINX)                                                          
  2003.       WRITE (CHR,900)                                                           
  2004.       AY = FLOAT(MINY + LENY) - 2.*AT1                                          
  2005.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,37)                                       
  2006.       WRITE (CHR,901) RUNID, INDX, MOVION, NTV, NPRS, NPRO                      
  2007.       AY = AY - AT1                                                             
  2008.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,64)                                       
  2009.       WRITE (CHR,902) T0, TEND, DT, RMASS                                       
  2010.       AY = AY - AT1                                                             
  2011.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,59)                                       
  2012.       WRITE (CHR,903) LTS, ITS, NTS, MTS                                        
  2013.       AY = AY - AT1                                                             
  2014.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,44)                                       
  2015.       WRITE (CHR,904) IDS, NDS, ION, IFL                                        
  2016.       AY = AY - AT1                                                             
  2017.       CALL DRSTRG(CHR,AX,AY,IC,LW,ICW,44)                                       
  2018.       CALL SGRAPH                                                               
  2019.       CALL READC(IRC)                                                           
  2020.       RETURN                                                                    
  2021.       END                                                                       
  2022. *                                                                               
  2023. *****************************************************                           
  2024. * GCLOSE                                                                        
  2025. *****************************************************                           
  2026. *                                                                               
  2027.       SUBROUTINE GCLOSE                                                         
  2028. C THIS SUBROUTINE CLOSES GRAPHICS LIBRARY                                       
  2029.       COMMON /PLOTCM/ IPLOT, NPLOT, IDTYPE                                      
  2030.       IF (IPLOT.EQ.0) GO TO 10                                                  
  2031.       CALL SGRAPH                                                               
  2032.       CALL READC(IRC)                                                           
  2033.    10 CALL QUITG                                                                
  2034.       RETURN                                                                    
  2035.       END                                                                       
  2036. *                                                                               
  2037. *****************************************************                           
  2038. * VERSTC -- TEKTRONIX TO RASTER CONVERSION                                      
  2039. *****************************************************                           
  2040. *                                                                               
  2041. C TEKTRONIX EMULATOR LIBRARY FOR RASTER PLOTS                                   
  2042.       SUBROUTINE VERSTC (IA,IC,IRB)                                             
  2043. C THIS PROGRAM SENDS TEKTRONIX 4012 INFORMATION TO RASTER FILE                  
  2044. C WRITTEN FOR THE IBM 3090VF - VIKTOR K. DECYK, UCLA                            
  2045.       COMMON /DEVICE/ ID, ICFLG                                                 
  2046.       CHARACTER*1 LBL                                                           
  2047.       DIMENSION IA(4)                                                           
  2048.       DIMENSION LT(8), ICOLOR(8), LW(3), IATE(128)                              
  2049.       SAVE IG,NF,ND,IRD,IX,IY,IF,LS,LT,ICOLOR,LW,IATE                           
  2050.       SAVE XS,YS,ICX,ICY,IHY,IBY,LTYPE,ICTYPE,LWTYPE                            
  2051.       SAVE LX,LY,IYH,IYL,IXH,IXL                                                
  2052.    93 FORMAT (1H1,I6,17H FRAME(S) PLOTTED)                                      
  2053.       DATA IG,NF,ND,IP,IRD,IZ,IF,LS /0,0,0,0,0,0,0,0/                           
  2054. C LINE STYLE TABLE                                                              
  2055.       DATA LT /0,1,2,3,4,0,0,0/                                                 
  2056. C COLORS TABLE: FOREGROUND,BLUE,RED,YELLOW,CYAN,MAGENTA,GREEN,FOREGROUND        
  2057.       DATA ICOLOR /7,1,4,6,3,5,2,7/                                             
  2058. C LINE WIDTH TABLE                                                              
  2059.       DATA LW /1,2,1/                                                           
  2060. C EBCDIC CODE FOR ASCII 124 IS NON-STANDARD                                     
  2061.       DATA IATE /0,1,2,3,55,45,46,47,22,5,37,11,12,13,14,15,16,17,18,19,        
  2062.      160,61,50,38,24,25,63,39,34,29,53,31,64,90,127,123,91,108,80,125,77        
  2063.      2,93,92,78,107,96,75,97,240,241,242,243,244,245,246,247,248,249,122        
  2064.      3,94,76,126,110,111,124,193,194,195,196,197,198,199,200,201,209,210        
  2065.      4,211,212,213,214,215,216,217,226,227,228,229,230,231,232,233,173,2        
  2066.      524,189,95,109,121,129,130,131,132,133,134,135,136,137,145,146,147,        
  2067.      6148,149,150,151,152,153,162,163,164,165,166,167,168,169,192,79,208        
  2068.      7,161,7/                                                                   
  2069.       IRB = 0                                                                   
  2070.       IF (IC.LT.1) GO TO 300                                                    
  2071.       K = 1                                                                     
  2072.       IF (IRD.EQ.0) GO TO 290                                                   
  2073.       GO TO (10,70,220,230,250), IRD                                            
  2074. C READ CHARACTER                                                                
  2075.    10 IRD = 1                                                                   
  2076.       IF (K.GT.IC) GO TO 310                                                    
  2077.       LC = IA(K)                                                                
  2078.       K = K + 1                                                                 
  2079.    20 IF (LC.LT.32) GO TO 30                                                    
  2080.       IF (IG.GT.0) GO TO 200                                                    
  2081. C ALPHA MODE                                                                    
  2082. C     LBL = CHAR(LC)                                                            
  2083.       LBL = CHAR(IATE(LC+1))                                                    
  2084. C PLOT CHARACTER                                                                
  2085.       AX = FLOAT(IX)                                                            
  2086.       AY = FLOAT(IY)                                                            
  2087.       CALL DRAWG(LBL,AX,AY,ICTYPE,LWTYPE,0,5)                                   
  2088.       GO TO 150                                                                 
  2089. C CONTROL CHARACTERS                                                            
  2090.    30 IF (LC.EQ.29) GO TO 40                                                    
  2091.       IF (LC.EQ.13) GO TO 50                                                    
  2092.       IF (LC.EQ.31) GO TO 60                                                    
  2093.       IF (LC.EQ.27) GO TO 70                                                    
  2094.       IF (LC.EQ.28) GO TO 140                                                   
  2095.       IF (LC.EQ.9) GO TO 150                                                    
  2096.       IF (LC.EQ.10) GO TO 160                                                   
  2097.       IF (LC.EQ.8) GO TO 170                                                    
  2098.       IF (LC.EQ.11) GO TO 180                                                   
  2099.       IF (LC.EQ.7) GO TO 190                                                    
  2100. C UNKNOWN CONTROL CHARACTER                                                     
  2101.       GO TO 10                                                                  
  2102. C SET GRAPH MODE (DARK VECTOR)                                                  
  2103.    40 IG = 2                                                                    
  2104.       GO TO 10                                                                  
  2105. C CARRIAGE RETURN                                                               
  2106.    50 IX = IZ                                                                   
  2107. C SET ALPHA MODE                                                                
  2108.    60 IG = 0                                                                    
  2109.       GO TO 10                                                                  
  2110. C ESCAPE SEQUENCE                                                               
  2111.    70 IRD = 2                                                                   
  2112.       IF (K.GT.IC) GO TO 310                                                    
  2113.       LC = IA(K)                                                                
  2114.       K = K + 1                                                                 
  2115.       IF (LC.EQ.12) GO TO 80                                                    
  2116.       IF (LC.EQ.23) GO TO 90                                                    
  2117.       IF (LC.EQ.56) GO TO 100                                                   
  2118.       IF (LC.EQ.57) GO TO 110                                                   
  2119.       IF (LC.EQ.58) GO TO 120                                                   
  2120.       IF (LC.EQ.59) GO TO 130                                                   
  2121.       IF ((LC.GE.96).AND.(LC.LE.119)) GO TO 135                                 
  2122. C UNSUPPORTED ESCAPE SEQUENCE                                                   
  2123.       GO TO 10                                                                  
  2124. C NEW FRAME                                                                     
  2125.    80 NF = NF + 1                                                               
  2126.       IF (NF.LT.ND) GO TO 89                                                    
  2127.       IF (NF.EQ.ND) GO TO 85                                                    
  2128.       IF (ID.EQ.1) CALL LABELF(NF)                                              
  2129.       CALL DRAWG(' ',0.,0.,0,0,0,6)                                             
  2130.       ND = ND + 1                                                               
  2131.       IF (ID.GT.1) GO TO 85                                                     
  2132.       CALL READN(IRC,NRC)                                                       
  2133.       IF (IRC.NE.1) GO TO 83                                                    
  2134.       CALL QUITG                                                                
  2135.       WRITE (6,93) NF                                                           
  2136.       STOP 1                                                                    
  2137.    83 IF (IRC.EQ.2) ND = NRC - 1                                                
  2138.       IF (NF.LT.ND) GO TO 89                                                    
  2139.       IF (NF.EQ.ND) GO TO 85                                                    
  2140.       NF = 0                                                                    
  2141.       IRD = 1                                                                   
  2142.       IRB = 1                                                                   
  2143.       IF (NF.LT.ND) GO TO 84                                                    
  2144.       CALL CHARSZ(ICY,ICX)                                                      
  2145.       CALL DRAWG(' ',0.,0.,0,0,0,0)                                             
  2146.       LTYPE = LT(1)                                                             
  2147.       ICTYPE = ICOLOR(1)                                                        
  2148.       LWTYPE = LW(1)                                                            
  2149.    84 IG = 0                                                                    
  2150.       LS = 0                                                                    
  2151.       IF = 0                                                                    
  2152.       IX = IZ                                                                   
  2153.       IY = IHY                                                                  
  2154.       GO TO 310                                                                 
  2155.    85 CALL DRAWG(' ',0.,0.,0,0,0,0)                                             
  2156.       LTYPE = LT(1)                                                             
  2157.       ICTYPE = ICOLOR(1)                                                        
  2158.       LWTYPE = LW(1)                                                            
  2159.    89 IG = 0                                                                    
  2160.       LS = 0                                                                    
  2161.       IF = 0                                                                    
  2162.       IX = IZ                                                                   
  2163.       IY = IHY                                                                  
  2164.       GO TO 10                                                                  
  2165. C MAKE HARDCOPY                                                                 
  2166.    90 IF (IP.GT.0) GO TO 10                                                     
  2167.       GO TO 10                                                                  
  2168. C LARGE CHARACTERS                                                              
  2169.   100 ICX = 14.*XS + .5                                                         
  2170.       ICY = 22.*YS + .5                                                         
  2171.       CALL CHARSZ(ICY,ICX)                                                      
  2172.       GO TO 10                                                                  
  2173. C MEDIUM-LARGE CHARACTERS                                                       
  2174.   110 ICX = 13.*XS + .5                                                         
  2175.       ICY = 21.*YS + .5                                                         
  2176.       CALL CHARSZ(ICY,ICX)                                                      
  2177.       GO TO 10                                                                  
  2178. C MEDIUM-SMALL CHARACTERS                                                       
  2179.   120 ICX = 9.*XS + .5                                                          
  2180.       ICY = 13.*YS + .5                                                         
  2181.       CALL CHARSZ(ICY,ICX)                                                      
  2182.       GO TO 10                                                                  
  2183. C SMALL CHARACTERS                                                              
  2184.   130 ICX = 8.*XS + .5                                                          
  2185.       ICY = 12.*YS + .5                                                         
  2186.       CALL CHARSZ(ICY,ICX)                                                      
  2187.       GO TO 10                                                                  
  2188. C SET LINE STYLE AND FOCUS                                                      
  2189.   135 LS = LC - 96                                                              
  2190.       IF = LS/8                                                                 
  2191.       LS = LS - IF*8                                                            
  2192.       LTYPE = LT(1)                                                             
  2193.       IF (ICFLG.NE.1) LTYPE = LT(LS+1)                                          
  2194.       ICTYPE = ICOLOR(1)                                                        
  2195.       IF (ICFLG.NE.0) ICTYPE = ICOLOR(LS+1)                                     
  2196.       LWTYPE = LW(IF+1)                                                         
  2197.       GO TO 10                                                                  
  2198. C POINT PLOTTING MODE                                                           
  2199.   140 IG = 3                                                                    
  2200.       GO TO 10                                                                  
  2201. C TAB                                                                           
  2202.   150 IX = IX + ICX                                                             
  2203.       IF (IX.LT.LX) GO TO 10                                                    
  2204.       IX = IX - LX                                                              
  2205. C LINE FEED                                                                     
  2206.   160 IY = IY - ICY                                                             
  2207.       IF (IY.LT.IZ) IY = IHY                                                    
  2208.       GO TO 10                                                                  
  2209. C BACKSPACE                                                                     
  2210.   170 IX = IX - ICX                                                             
  2211.       IF (IX.GE.IZ) GO TO 10                                                    
  2212.       IX = IX + LX                                                              
  2213. C VERTICAL TAB                                                                  
  2214.   180 IY = IY + ICY                                                             
  2215.       IF (IY.GE.LY) IY = IBY                                                    
  2216.       GO TO 10                                                                  
  2217. C BELL (SET VECTOR TO DRAW)                                                     
  2218.   190 IF (IG.EQ.2) IG = 1                                                       
  2219.       GO TO 10                                                                  
  2220. C GRAPH MODE                                                                    
  2221. C DECODE ADDRESS                                                                
  2222.   200 IF (LC.LT.64) GO TO 240                                                   
  2223.       IF (LC.LT.96) GO TO 260                                                   
  2224.   210 IYL = LC                                                                  
  2225.   220 IRD = 3                                                                   
  2226.       IF (K.GT.IC) GO TO 310                                                    
  2227.       LC = IA(K)                                                                
  2228.       K = K + 1                                                                 
  2229.       IF (LC.GE.96) GO TO 210                                                   
  2230.       IF (LC.GE.64) GO TO 260                                                   
  2231.       IF (LC.LT.32) GO TO 220                                                   
  2232.       IXH = LC                                                                  
  2233.   230 IRD = 4                                                                   
  2234.       IF (K.GT.IC) GO TO 310                                                    
  2235.       LC = IA(K)                                                                
  2236.       K = K + 1                                                                 
  2237.       IF (LC.GE.32) GO TO 260                                                   
  2238.       GO TO 230                                                                 
  2239.   240 IYH = LC                                                                  
  2240.   250 IRD = 5                                                                   
  2241.       IF (K.GT.IC) GO TO 310                                                    
  2242.       LC = IA(K)                                                                
  2243.       K = K + 1                                                                 
  2244.       IF (LC.GE.96) GO TO 210                                                   
  2245.       IF (LC.LT.32) GO TO 250                                                   
  2246.   260 IXL = LC                                                                  
  2247. C CALCULATE ADDRESS                                                             
  2248.       I = (IXH - 34)*32 + IXL                                                   
  2249.       J = (IYH - 35)*32 + IYL                                                   
  2250.       I = XS*FLOAT(I) + .5                                                      
  2251.       J = YS*FLOAT(J) + .5                                                      
  2252. C PERFORM CLIPPING                                                              
  2253.       IF (I.LT.IZ) I = IZ                                                       
  2254.       IF (I.GE.LX) I = LX - 1                                                   
  2255.       IF (J.LT.IZ) J = IZ                                                       
  2256.       IF (J.GE.LY) J = LY - 1                                                   
  2257. C CONVERT TO FLOATING POINT REPRESENTATION                                      
  2258.       AX = FLOAT(I)                                                             
  2259.       AY = FLOAT(J)                                                             
  2260.       IF (IG.NE.1) GO TO 270                                                    
  2261. C DRAW VECTOR                                                                   
  2262.       IF (ICFLG.EQ.1) CALL DRAWG(' ',AX,AY,ICTYPE,LWTYPE,0,2)                   
  2263.       IF (ICFLG.NE.1) CALL DRAWG(' ',AX,AY,ICTYPE,LWTYPE,LTYPE,4)               
  2264.       IX = I                                                                    
  2265.       IY = J                                                                    
  2266.       GO TO 10                                                                  
  2267. C PERFORM MOVE AND SET VECTOR TO DRAW                                           
  2268.   270 IF (IG.EQ.3) GO TO 280                                                    
  2269.       CALL DRAWG(' ',AX,AY,ICTYPE,LWTYPE,0,1)                                   
  2270.       IX = I                                                                    
  2271.       IY = J                                                                    
  2272.       IG = 1                                                                    
  2273.       GO TO 10                                                                  
  2274. C PLOT POINT                                                                    
  2275.   280 CALL DRAWG(' ',AX,AY,ICTYPE,LWTYPE,0,3)                                   
  2276.       IX = I                                                                    
  2277.       IY = J                                                                    
  2278.       GO TO 10                                                                  
  2279. C SET SCALES FOR FIRST PLOT                                                     
  2280.   290 CALL STARTG                                                               
  2281.       CALL GRPARM(3,LX,LY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY,N        
  2282.      1TCX,NTCY,IGSTYL)                                                          
  2283.       XS = FLOAT(LX - 1)/1023.                                                  
  2284.       YS = FLOAT(LY - 1)/780.                                                   
  2285.       ICX = 14.*XS + .5                                                         
  2286.       ICY = 22.*YS + .5                                                         
  2287.       IHY = 767.*YS + .5                                                        
  2288.       IBY = IZ                                                                  
  2289.       IX = IBY                                                                  
  2290.       IY = IHY                                                                  
  2291.       LTYPE = LT(1)                                                             
  2292.       ICTYPE = ICOLOR(1)                                                        
  2293.       LWTYPE = LW(1)                                                            
  2294.       CALL INITGR(LX,LY,ICY,ICX)                                                
  2295.       GO TO 10                                                                  
  2296. C LAST PLOT                                                                     
  2297.   300 NF = NF + 1                                                               
  2298.       IF (NF.GT.ND) GO TO 301                                                   
  2299.       CALL DRAWG(' ',0.,0.,0,0,0,0)                                             
  2300.   301 IF (ID.EQ.1) CALL LABELF(NF)                                              
  2301.       CALL DRAWG(' ',0.,0.,0,0,0,6)                                             
  2302.       ND = ND + 1                                                               
  2303.       IF (ID.GT.1) GO TO 305                                                    
  2304.       CALL READN(IRC,NRC)                                                       
  2305.       IF (IRC.NE.1) GO TO 303                                                   
  2306.       CALL QUITG                                                                
  2307.       WRITE (6,93) NF                                                           
  2308.       STOP 1                                                                    
  2309.   303 IF (IRC.EQ.2) ND = NRC - 1                                                
  2310.       IF (NF.LE.ND) GO TO 305                                                   
  2311.       NF = 0                                                                    
  2312.       IRD = 1                                                                   
  2313.       IRB = 1                                                                   
  2314.       IF (NF.LT.ND) GO TO 304                                                   
  2315.       CALL CHARSZ(ICY,ICX)                                                      
  2316.       CALL DRAWG(' ',0.,0.,0,0,0,0)                                             
  2317.       LTYPE = LT(1)                                                             
  2318.       ICTYPE = ICOLOR(1)                                                        
  2319.       LWTYPE = LW(1)                                                            
  2320.   304 IG = 0                                                                    
  2321.       LS = 0                                                                    
  2322.       IF = 0                                                                    
  2323.       IX = IZ                                                                   
  2324.       IY = IHY                                                                  
  2325.       GO TO 310                                                                 
  2326.   305 CALL QUITG                                                                
  2327.       WRITE (6,93) NF                                                           
  2328.   310 RETURN                                                                    
  2329.       END                                                                       
  2330. *                                                                               
  2331. *****************************************************                           
  2332. * LABELF -- PUTS LABEL IN GRAPHS FOR RASTER PLOTS                               
  2333. *****************************************************                           
  2334. *                                                                               
  2335.       SUBROUTINE LABELF(NF)                                                     
  2336. C THIS SUBROUTINE PUTS LABEL IN GRAPHS FOR RASTER PLOTS                         
  2337.       CHARACTER*9 LBL                                                           
  2338.       SAVE LW,IC                                                                
  2339.       DATA LW,IC /1,7/                                                          
  2340.       CALL GRPARM(3,LX,LY,MINX,MINY,LENX,LENY,ICH,ICW,ISLB,ISTCX,ISTCY,N        
  2341.      1TCX,NTCY,IGSTYL)                                                          
  2342.       CALL CHARSZ(ICH,ICW)                                                      
  2343.       AX = FLOAT(MINX + LENX - 9*ICW - 1)                                       
  2344.       AY = FLOAT(MINY)                                                          
  2345.       IS = ICHAR('0')                                                           
  2346.       ID = 0                                                                    
  2347.       N = NF                                                                    
  2348.    10 ID = ID + 1                                                               
  2349.       N = N/10                                                                  
  2350.       IF (N.GT.0) GO TO 10                                                      
  2351.       LBL = '#        '                                                         
  2352.       NT = NF                                                                   
  2353.       LS = 10**(ID - 1)                                                         
  2354.       DO 20 I = 1, ID                                                           
  2355.       I1 = I + 1                                                                
  2356.       N = NT/LS                                                                 
  2357.       LBL (I1:I1) = CHAR(N+IS)                                                  
  2358.       NT = NT - N*LS                                                            
  2359.       LS = LS/10                                                                
  2360.    20 CONTINUE                                                                  
  2361.       N = ID + 1                                                                
  2362.       CALL DRSTRG(LBL,AX,AY,IC,LW,ICW,N)                                        
  2363.       RETURN                                                                    
  2364.       END                                                                       
  2365. *                                                                               
  2366. *****************************************************                           
  2367. * READN -- READS CHARACTERS                                                     
  2368. *****************************************************                           
  2369. *                                                                               
  2370.       SUBROUTINE READN(IRC,NRC)                                                 
  2371. C THIS SUBROUTINE READS CHARACTERS AND OUTPUTS CODE AND VALUE                   
  2372.       CHARACTER*1 C                                                             
  2373.       CHARACTER*8 CX                                                            
  2374.       CHARACTER*40 CHR                                                          
  2375.    91 FORMAT (1X,A40)                                                           
  2376.       DATA CHR /' Q=QUIT, #=DISPLAY FRAME #, CR=CONTINUE '/                     
  2377.       IRC = 0                                                                   
  2378.       NRC = 0                                                                   
  2379.    10 CALL CINPUT(CX)                                                           
  2380.       C = CX(1:1)                                                               
  2381.       IF (C.NE.'?') GO TO 20                                                    
  2382.       CALL CLEAR                                                                
  2383.       WRITE (6,91) CHR                                                          
  2384.       GO TO 10                                                                  
  2385.    20 IF ((C.EQ.'Q').OR.(C.EQ.'q')) IRC = 1                                     
  2386.       IF (IRC.EQ.1) GO TO 30                                                    
  2387.       CALL EVALC(CX,IVAL,VAL,ID)                                                
  2388.       IF (ID.EQ.0) GO TO 30                                                     
  2389.       NRC = IVAL                                                                
  2390.       IRC = 2                                                                   
  2391.    30 RETURN                                                                    
  2392.       END                                                                       
  2393. *                                                                               
  2394. *****************************************************                           
  2395. * SELFMP -- INITIALIZES DEFAULT MAPPING                                         
  2396. *****************************************************                           
  2397. *                                                                               
  2398.       SUBROUTINE SELFMP(IRX,IRY)                                                
  2399. C THIS SUBROUTINE INITIALIZES DEFAULT MAPPING                                   
  2400.       COMMON /RCOM/ MINX,LENX,MINY,LENY,ICX,ICY,                                
  2401.      1XMIN,XMAX,YMIN,YMAX,DX,DY,CSX,CSY                                         
  2402.       MINX = 0                                                                  
  2403.       LENX = IRX - 1                                                            
  2404.       MINY = 0                                                                  
  2405.       LENY = IRY - 1                                                            
  2406.       XMIN = FLOAT(MINX)                                                        
  2407.       XMAX = FLOAT(MINX + LENX)                                                 
  2408.       YMIN = FLOAT(MINY)                                                        
  2409.       YMAX = FLOAT(MINY + LENY)                                                 
  2410.       DX = FLOAT(LENX)/(XMAX - XMIN)                                            
  2411.       DY = FLOAT(LENY)/(YMAX - YMIN)                                            
  2412.       RETURN                                                                    
  2413.       END                                                                       
  2414. *                                                                               
  2415. *****************************************************                           
  2416. * MAPWIN -- SETS UP VARIABLE MAPPING                                            
  2417. *****************************************************                           
  2418. *                                                                               
  2419.       SUBROUTINE MAPWIN(XMN,XMX,YMN,YMX,MNX,LNX,MNY,LNY)                        
  2420. C THIS SUBROUTINE SETS UP VARIABLE MAPPING                                      
  2421.       COMMON /RCOM/ MINX,LENX,MINY,LENY,ICX,ICY,                                
  2422.      1XMIN,XMAX,YMIN,YMAX,DX,DY,CSX,CSY                                         
  2423.       MINX = MNX                                                                
  2424.       LENX = LNX                                                                
  2425.       MINY = MNY                                                                
  2426.       LENY = LNY                                                                
  2427.       XMIN = XMN                                                                
  2428.       XMAX = XMX                                                                
  2429.       YMIN = YMN                                                                
  2430.       YMAX = YMX                                                                
  2431.       DX = FLOAT(LENX)/(XMAX - XMIN)                                            
  2432.       DY = FLOAT(LENY)/(YMAX - YMIN)                                            
  2433.       RETURN                                                                    
  2434.       END                                                                       
  2435. *                                                                               
  2436. *****************************************************                           
  2437. * CHARSZ -- SETS UP VARIABLE MAPPING                                            
  2438. *****************************************************                           
  2439. *                                                                               
  2440.       SUBROUTINE CHARSZ(ICH,ICW)                                                
  2441. C THIS SUBROUTINE SETS UP VARIABLE MAPPING                                      
  2442.       COMMON /RCOM/ MINX,LENX,MINY,LENY,ICX,ICY,                                
  2443.      1XMIN,XMAX,YMIN,YMAX,DX,DY,CSX,CSY                                         
  2444.       CSX = FLOAT(ICW)/14.                                                      
  2445.       CSY = FLOAT(ICH)/16.                                                      
  2446.       RETURN                                                                    
  2447.       END                                                                       
  2448. *                                                                               
  2449. *****************************************************                           
  2450. * ZIMAGE ZEROES OUT IMAGE                                                       
  2451. *****************************************************                           
  2452. *                                                                               
  2453.       SUBROUTINE ZIMAGE(G,BLANK,LX,LY)                                          
  2454. C THIS SUBROUTINE ZEROES OUT IMAGE                                              
  2455.       CHARACTER*1 G(LX,LY)                                                      
  2456.       CHARACTER*1 BLANK                                                         
  2457.       DO 20 K = 1, LY                                                           
  2458.       DO 10 J = 1, LX                                                           
  2459.       G(J,K) = BLANK                                                            
  2460.    10 CONTINUE                                                                  
  2461.    20 CONTINUE                                                                  
  2462.       RETURN                                                                    
  2463.       END                                                                       
  2464. *                                                                               
  2465. *****************************************************                           
  2466. * CDRAW -- DRAWS CHARACTER WITH ASCII CODE IC AT IX,IY                          
  2467. *****************************************************                           
  2468. *                                                                               
  2469.       SUBROUTINE CDRAW(G,CTYPE,BLANK,LX,LY,IC,IX,IY,ICX,ICY,SX,SY,LWTYPE        
  2470.      1)                                                                         
  2471. C THIS SUBROUTINE DRAWS CHARACTER WITH ASCII CODE IC AT LOCATION IX,IY          
  2472. C WITH SCALING FACTORS SX,SY                                                    
  2473. C FOR RASTER FILE                                                               
  2474.       CHARACTER*1 G(LX,LY)                                                      
  2475.       CHARACTER*1 CTYPE,BLANK                                                   
  2476.       DIMENSION LB(8)                                                           
  2477.       DIMENSION ICFLEN(94), ICFLOC(94)                                          
  2478.       DIMENSION ICFON1(114), ICFON2(114), ICFONT(228)                           
  2479.       EQUIVALENCE (ICFON1(1), ICFONT(1)), (ICFON2(1), ICFONT(115))              
  2480.       SAVE LW,NW,ICFLEN,ICFLOC,ICFONT                                           
  2481.       DATA LW,NW /8,-2147483647/                                                
  2482.       DATA ICFLEN /10,10,20,35,43,25,5,9,9,15,10,7,5,5,5,32,12,21,28,9,1        
  2483.      19,23,9,35,23,10,12,7,10,7,18,47,13,23,25,16,14,9,32,12,15,16,9,7,8        
  2484.      2,6,27,12,32,14,25,10,13,11,24,7,16,9,9,5,9,7,2,5,24,19,17,22,21,18        
  2485.      3,28,13,10,11,9,11,24,13,19,22,22,11,21,18,16,11,24,7,22,9,23,10,23        
  2486.      4,13/                                                                      
  2487.       DATA ICFLOC /1,3,5,8,13,19,23,24,26,28,30,32,33,34,35,36,40,42,45,        
  2488.      149,51,54,57,59,64,67,69,71,72,74,75,78,84,86,89,93,95,97,99,103,10        
  2489.      25,107,109,111,112,113,114,118,120,124,126,130,132,134,136,139,140,        
  2490.      3142,144,146,147,149,150,151,152,155,158,161,164,167,170,174,176,17        
  2491.      48,180,182,184,187,189,192,195,198,200,203,206,208,210,213,214,217,        
  2492.      5219,222,224,227/                                                          
  2493.       DATA ICFON1 /-184213676,1543503872,-225259652,2030043136,-21785408        
  2494.      14,1895448655,145227776,-266266598,977822304,-2137868103,-135079911        
  2495.      27,62914560,-266682549,1008470793,406341963,-164148918,974718726,37        
  2496.      32244480,-100622159,-1010518880,1612842506,1073741824,-174735360,-1        
  2497.      467562346,-1073741824,-200853612,-1073741824,-266682532,1358565552,        
  2498.      5-261460132,1342177280,-217766608,-244752384,-184217600,-266686464,        
  2499.      6-264207692,-959923574,1209402370,273613227,-224017137,545259520,-2        
  2500.      757767222,-1433902496,1074397184,-257767222,-1433902225,-2036030848        
  2501.      8,537001984,-133644182,1610612736,-88031128,1783244801,1048576,-896        
  2502.      903392,-1608382454,709386336,-255146715,0,-121454432,-2107086262,67        
  2503.      A1219744,1114139274,-1463812096,-94216064,-1563899222,671219744,-17        
  2504.      B4747820,1392508928,-174747820,1395720192,-134059840,-259354716,671        
  2505.      C08864,-234331456,-257767222,-1433055407,1342177280,-145258860,-182        
  2506.      D0109754,1196968266,1519957700,-1028616142,335939600,123512736,-261        
  2507.      E464064,210545320,-2046363542,1244135424,-90655036,-1028620222,3359        
  2508.      F39610,805306368,209492648,-1533906944,212660327,1872756736,2126621        
  2509.      G12,1610612736,-90655036,-1028620222,335939610,974103395,217082479,        
  2510.      H-1398800384,-217641136,1559480256,-266205688,684682412,217759850,0        
  2511.      I,217710592,207137952,211856384,-264207692/                                
  2512.       DATA ICFON2 /-959923574,1209402370,272629760,210545320,-2046427136        
  2513.      1,-264207692,-959923574,1209402370,273638560,210545320,-2046386176,        
  2514.      2-267319286,709386848,-2136815158,-1342177280,-184168692,-140928614        
  2515.      34,-255839736,171622400,-255830774,1522532352,-255839741,86335314,1        
  2516.      4887478700,-1393505792,-255814299,257337772,-1408435712,0,-18869452        
  2517.      54,0,-256241664,-154482170,0,-265979360,-1610612736,-171483136,-244        
  2518.      6152182,1779409956,35684513,217084552,-1972754430,1048576,-92700032        
  2519.      7,1612843274,268435456,-99954777,-2010642942,545300736,-263566744,-        
  2520.      82105515998,134811648,1089602227,-976830715,1157627904,-89603392,-1        
  2521.      9604171702,1605018240,268500992,217084552,-1972764672,-184184997,15        
  2522.      A43503872,-137943807,1048576,217743434,0,-238894556,83886080,149975        
  2523.      B683,-2056974506,2022221472,149975688,-1972764672,-266313080,-19727        
  2524.      C54430,2097152,-268382453,747416230,-2078014208,-99954773,-19432709        
  2525.      D06,612672768,149963895,-1990197248,-250476534,675430498,-198741606        
  2526.      E4,-205318906,135868168,1744830464,-91615327,-2145385976,-260025078        
  2527.      F,1518338048,-260034045,86327122,1887478696,-1460631040,-87414783,2        
  2528.      G034694,612672768,-259358710,0,-137968204,-1804377004,890636032,-17        
  2529.      H1602092,1342177280,-205208138,-1770559914,890503936,-261979257,121        
  2530.      I2833792/                                                                  
  2531.       IS = IC - 32                                                              
  2532.       IF ((IS.LT.1).OR.(IS.GT.94)) GO TO 60                                     
  2533.       ID = 0                                                                    
  2534.       IF ((IS.EQ.71).OR.(IS.EQ.74).OR.(IS.EQ.80).OR.(IS.EQ.81).OR.(IS.EQ        
  2535.      1.89)) ID = 4                                                              
  2536.       MW = NW - 1                                                               
  2537.       LWM = LW - 1                                                              
  2538.       LWP = LW + 1                                                              
  2539.       LEN = ICFLEN(IS)                                                          
  2540.       LENW = (LEN - 1)/LW + 1                                                   
  2541.       IOFF = ICFLOC(IS) - 1                                                     
  2542.       IL = LW                                                                   
  2543.       MY = 0                                                                    
  2544.       IM = 0                                                                    
  2545.       CALL DMOVE(IX,IY,ICX,ICY)                                                 
  2546. C MAIN LOOP                                                                     
  2547.       DO 50 I = 1, LENW                                                         
  2548.       IT = ICFONT(I+IOFF)                                                       
  2549. C     IF (IT.LT.0) IT = 4294967296 + IT                                         
  2550.       LB(1) = IT                                                                
  2551.       IF (LB(1).LT.0) LB(1) = LB(1) - MW                                        
  2552. C DECODE COORDINATES                                                            
  2553.       DO 10 J = 1, LWM                                                          
  2554.       LB(J+1) = LB(J)/16                                                        
  2555.       LB(J) = LB(J) - LB(J+1)*16                                                
  2556.    10 CONTINUE                                                                  
  2557.       IF (IT.LT.0) LB(LW) = LB(LW) + 8                                          
  2558.       IF (I.EQ.LENW) IL = LEN - (I - 1)*LW                                      
  2559. C DRAW CHARACTER                                                                
  2560.       DO 40 J = 1, IL                                                           
  2561.       IT = LB(LWP-J)                                                            
  2562.       IF (MY.EQ.1) GO TO 30                                                     
  2563. C X COORDINATE OR MOVE FLAG                                                     
  2564.       IF (IT.EQ.15) GO TO 20                                                    
  2565.       IT = SX*FLOAT(IT) + .5                                                    
  2566.       JX = IX + IT                                                              
  2567.       MY = 1                                                                    
  2568.       GO TO 40                                                                  
  2569.    20 IM = 1                                                                    
  2570.       GO TO 40                                                                  
  2571. C Y COORDINATE                                                                  
  2572.    30 IT = SY*FLOAT(IT - ID) + .5                                               
  2573.       JY = IY + IT                                                              
  2574.       IF (IM.EQ.0) CALL DLINE(G,CTYPE,BLANK,LX,LY,JX,JY,ICX,ICY,LWTYPE)         
  2575.       IF (IM.EQ.1) CALL DMOVE(JX,JY,ICX,ICY)                                    
  2576.       MY = 0                                                                    
  2577.       IM = 0                                                                    
  2578.    40 CONTINUE                                                                  
  2579.    50 CONTINUE                                                                  
  2580.       CALL DMOVE(IX,IY,ICX,ICY)                                                 
  2581.    60 RETURN                                                                    
  2582.       END                                                                       
  2583. *                                                                               
  2584. *****************************************************                           
  2585. * DMOVE -- MOVES CURSOR                                                         
  2586. *****************************************************                           
  2587. *                                                                               
  2588.       SUBROUTINE DMOVE(I,J,ICX,ICY)                                             
  2589. C THIS SUBROUTINE MOVES CURSOR TO (I,J)                                         
  2590.       ICX = I                                                                   
  2591.       ICY = J                                                                   
  2592.       RETURN                                                                    
  2593.       END                                                                       
  2594. *                                                                               
  2595. *****************************************************                           
  2596. * DLINE -- DRAWS LINE                                                           
  2597. *****************************************************                           
  2598. *                                                                               
  2599.       SUBROUTINE DLINE(G,CTYPE,BLANK,LX,LY,I,J,ICX,ICY,LWTYPE)                  
  2600. C THIS SUBROUTINE DRAWS LINE FROM (ICX,ICY) TO (I,J)                            
  2601. C WITH CTYPE CHARACTER                                                          
  2602.       CHARACTER*1 G(LX,LY)                                                      
  2603.       CHARACTER*1 CTYPE,BLANK                                                   
  2604.       CHARACTER*1 XX                                                            
  2605.       XX = CTYPE                                                                
  2606.       IF (LWTYPE.LT.1) GO TO 60                                                 
  2607.       II = I - ICX                                                              
  2608.       JJ = J - ICY                                                              
  2609.       KK = 1                                                                    
  2610.       AJI = 1.                                                                  
  2611.       ALWTYPE = .5*FLOAT(LWTYPE)                                                
  2612.       IF (IABS(JJ).GT.IABS(II)) GO TO 30                                        
  2613.       IF (II.LT.0) KK = -1                                                      
  2614.       IF (II.NE.0) AJI = FLOAT(JJ)/FLOAT(II)                                    
  2615.       DO 20 N = 1, LWTYPE                                                       
  2616.       AJ = FLOAT(ICY + N) - ALWTYPE                                             
  2617.       DO 10 L = ICX, I, KK                                                      
  2618.       IF ((L.LT.0).OR.(L.GE.LX)) GO TO 10                                       
  2619.       M = AJI*FLOAT(L - ICX) + AJ                                               
  2620.       IF ((M.LT.0).OR.(M.GE.LY)) GO TO 10                                       
  2621.       IF (G(L+1,M+1).EQ.BLANK) G(L+1,M+1) = CTYPE                               
  2622.       IF (G(L+1,M+1).NE.CTYPE) G(L+1,M+1) = XX                                  
  2623. C     IF (G(L+1,M+1).NE.CTYPE) G(L+1,M+1) = CHAR(IOR(ICHAR(G(L+1,M+1)),I        
  2624. C    1CHAR(CTYPE)))                                                             
  2625.    10 CONTINUE                                                                  
  2626.    20 CONTINUE                                                                  
  2627.       GO TO 60                                                                  
  2628.    30 IF (JJ.LT.0) KK = -1                                                      
  2629.       AJI = FLOAT(II)/FLOAT(JJ)                                                 
  2630.       DO 50 N = 1, LWTYPE                                                       
  2631.       AI = FLOAT(ICX + N) - ALWTYPE                                             
  2632.       DO 40 M = ICY, J, KK                                                      
  2633.       IF ((M.LT.0).OR.(M.GE.LY)) GO TO 40                                       
  2634.       L = AJI*FLOAT(M - ICY) + AI                                               
  2635.       IF ((L.LT.0).OR.(L.GE.LX)) GO TO 40                                       
  2636.       IF (G(L+1,M+1).EQ.BLANK) G(L+1,M+1) = CTYPE                               
  2637.       IF (G(L+1,M+1).NE.CTYPE) G(L+1,M+1) = XX                                  
  2638. C     IF (G(L+1,M+1).NE.CTYPE) G(L+1,M+1) = CHAR(IOR(ICHAR(G(L+1,M+1)),I        
  2639. C    1CHAR(CTYPE)))                                                             
  2640.    40 CONTINUE                                                                  
  2641.    50 CONTINUE                                                                  
  2642.    60 ICX = I                                                                   
  2643.       ICY = J                                                                   
  2644.       RETURN                                                                    
  2645.       END                                                                       
  2646. *                                                                               
  2647. *****************************************************                           
  2648. * DPNT -- DRAWS POINT WITH CTYPE CHARACTER INTO G                               
  2649. *****************************************************                           
  2650. *                                                                               
  2651.       SUBROUTINE DPNT(G,CTYPE,BLANK,LX,LY,I,J,ICX,ICY,LWTYPE)                   
  2652. C THIS SUBROUTINE DRAWS POINT AT (I,J) WITH CTYPE CHARACTER                     
  2653.       CHARACTER*1 G(LX,LY)                                                      
  2654.       CHARACTER*1 CTYPE,BLANK                                                   
  2655.       CHARACTER*1 XX                                                            
  2656.       XX = CTYPE                                                                
  2657.       IF (LWTYPE.LT.1) GO TO 30                                                 
  2658.       IS = (LWTYPE + 1)/2                                                       
  2659.       N1 = I - IS                                                               
  2660.       K1 = J - IS                                                               
  2661.       DO 20 K = 1, LWTYPE                                                       
  2662.       M = K1 + K                                                                
  2663.       IF ((M.LT.0).OR.(M.GE.LY)) GO TO 20                                       
  2664.       DO 10 N = 1, LWTYPE                                                       
  2665.       L = N1 + N                                                                
  2666.       IF ((L.LT.0).OR.(L.GE.LX)) GO TO 10                                       
  2667.       IF (G(L+1,M+1).EQ.BLANK) G(L+1,M+1) = CTYPE                               
  2668.       IF (G(L+1,M+1).NE.CTYPE) G(L+1,M+1) = XX                                  
  2669. C     IF (G(L+1,M+1).NE.CTYPE) G(L+1,M+1) = CHAR(IOR(ICHAR(G(L+1,M+1)),I        
  2670. C    1CHAR(CTYPE)))                                                             
  2671.    10 CONTINUE                                                                  
  2672.    20 CONTINUE                                                                  
  2673.    30 ICX = I                                                                   
  2674.       ICY = J                                                                   
  2675.       RETURN                                                                    
  2676.       END                                                                       
  2677. *                                                                               
  2678. *****************************************************                           
  2679. * DASHLN -- DRAWS A DASHED LINE                                                 
  2680. *****************************************************                           
  2681. *                                                                               
  2682.       SUBROUTINE DASHLN(G,CTYPE,BLANK,LX,LY,I,J,ICX,ICY,L,LWTYPE)               
  2683. C THIS SUBROUTINE DRAWS A DASHED LINE FROM (ICX,ICY) TO (I,J)                   
  2684.       CHARACTER*1 G(LX,LY)                                                      
  2685.       CHARACTER*1 CTYPE,BLANK                                                   
  2686.       DIMENSION LT(4,4)                                                         
  2687.       SAVE NS,NL,LTYPE                                                          
  2688.       DATA LTYPE /0/                                                            
  2689.       DATA LT /5,5,5,5,14,6,4,6,9,6,9,6,23,7,23,7/                              
  2690.       IF ((L.EQ.LTYPE).OR.(L.LT.0).OR.(L.GT.7)) GO TO 10                        
  2691.       LTYPE = L                                                                 
  2692.       IF ((LTYPE.EQ.0).OR.(LTYPE.GT.4)) GO TO 50                                
  2693.       NS = 0                                                                    
  2694.       NL = LT(NS+1,LTYPE)                                                       
  2695.       GO TO 20                                                                  
  2696.    10 IF ((LTYPE.EQ.0).OR.(LTYPE.GT.4)) GO TO 50                                
  2697. C SOFTWARE DASHED LINE                                                          
  2698.    20 IX0 = ICX                                                                 
  2699.       IY0 = ICY                                                                 
  2700.       COST = FLOAT(I - ICX)                                                     
  2701.       SINT = FLOAT(J - ICY)                                                     
  2702.       ALEN = SQRT(COST*COST + SINT*SINT)                                        
  2703.       LEN = ALEN + .5                                                           
  2704.       IF (NL.GE.LEN) GO TO 40                                                   
  2705.       COST = COST/ALEN                                                          
  2706.       SINT = SINT/ALEN                                                          
  2707.    30 ANL = FLOAT(NL)                                                           
  2708.       IX = FLOAT(ICX) + ANL*COST + .5                                           
  2709.       IY = FLOAT(ICY) + ANL*SINT + .5                                           
  2710.       IT = NS - (NS/2)*2                                                        
  2711.       IF (IT.EQ.0) CALL DLINE(G,CTYPE,BLANK,LX,LY,IX,IY,IX0,IY0,LWTYPE)         
  2712.       IF (IT.EQ.1) CALL DMOVE(IX,IY,IX0,IY0)                                    
  2713.       NS = NS + 1                                                               
  2714.       IF (NS.EQ.4) NS = 0                                                       
  2715.       NL = NL + LT(NS+1,LTYPE)                                                  
  2716.       IF (NL.LT.LEN) GO TO 30                                                   
  2717.    40 IT = NS - (NS/2)*2                                                        
  2718.       IF (IT.EQ.0) CALL DLINE(G,CTYPE,BLANK,LX,LY,I,J,IX0,IY0,LWTYPE)           
  2719.       IF (IT.EQ.1) CALL DMOVE(I,J,IX0,IY0)                                      
  2720.       NL = NL - LEN                                                             
  2721.       IF (NL.GT.0) GO TO 60                                                     
  2722.       NS = NS + 1                                                               
  2723.       IF (NS.EQ.4) NS = 0                                                       
  2724.       NL = LT(NS+1,LTYPE)                                                       
  2725.       GO TO 60                                                                  
  2726. C SOLID LINE                                                                    
  2727.    50 CALL DLINE(G,CTYPE,BLANK,LX,LY,I,J,ICX,ICY,LWTYPE)                        
  2728.    60 ICX = I                                                                   
  2729.       ICY = J                                                                   
  2730.       RETURN                                                                    
  2731.       END                                                                       
  2732. *                                                                               
  2733. *****************************************************                           
  2734. * WIMAGE -- WRITES IMAGE (G) TO TERMINAL                                        
  2735. *****************************************************                           
  2736. *                                                                               
  2737.       SUBROUTINE WIMAGE(G,LX,LY)                                                
  2738. C THIS SUBROUTINE WRITES IMAGE TO TERMINAL                                      
  2739.       CHARACTER*1 G(LX,LY)                                                      
  2740.    91 FORMAT (1H1,128A1)                                                        
  2741.    92 FORMAT (1X,128A1)                                                         
  2742.       LY1 = LY + 1                                                              
  2743.       DO 10 K = 1, LY                                                           
  2744.       K1 = LY1 - K                                                              
  2745.       IF (K.EQ.1) WRITE (6,91) (G(J,K1),J=1,LX)                                 
  2746.       IF (K.GT.1) WRITE (6,92) (G(J,K1),J=1,LX)                                 
  2747.    10 CONTINUE                                                                  
  2748.       RETURN                                                                    
  2749.       END                                                                       
  2750. *                                                                               
  2751. *****************************************************                           
  2752. * CWRITE -- WRITES A CHARACTER INTO G                                           
  2753. *****************************************************                           
  2754. *                                                                               
  2755.       SUBROUTINE CWRITE(G,C,LX,LY,IX,IY,ICX,ICY)                                
  2756. C THIS SUBROUTINE WRITES CHARACTER AT LOCATION (IX,IY)                          
  2757.       CHARACTER*1 G(LX,LY)                                                      
  2758.       CHARACTER*1 C                                                             
  2759.       G(IX+1,IY+1) = C                                                          
  2760.       ICX = IX                                                                  
  2761.       ICY = IY                                                                  
  2762.       RETURN                                                                    
  2763.       END                                                                       
  2764. *                                                                               
  2765. *****************************************************                           
  2766. * header -- writes header in movie file                                         
  2767. *****************************************************                           
  2768. *                                                                               
  2769.       SUBROUTINE HEADER(IFRMT,LX,LY,NBIT)                                       
  2770.                                                                                 
  2771. C THIS SUBROUTINE WRITES HEADER IN MOVIE FILE                                   
  2772. C IF IFRMT = 1,2,3  UCLA FORMAT HEADER = IFRMT, LX, LY, NBIT                    
  2773. C LX, LY IS THE SIZE OF THE IMAGE, AND NBIT IS THE NUMBER OF COLORS             
  2774. C IF IFRMT = 4,   MFE FORMAT HEADER = FRMT                                      
  2775. C WHERE FRMT IS A 1 BYTE CHARACTER VARIABLE GIVEN BY:                           
  2776. C 241 FOR CGA, 242 FOR EGA, 243 FOR VGA                                         
  2777. C IF IFRMT = 0, NO HEADER                                                       
  2778.                                                                                 
  2779.       CHARACTER*1 CHR(16)                                                       
  2780.       DIMENSION IMGSIZ(4)                                                       
  2781.       IF ((IFRMT.LT.1).OR.(IFRMT.GT.4)) GO TO 20                                
  2782.       IF (IFRMT.EQ.4) GO TO 10                                                  
  2783.       IMGSIZ(1) = IFRMT                                                         
  2784.       IMGSIZ(2) = LX                                                            
  2785.       IMGSIZ(3) = LY                                                            
  2786.       IMGSIZ(4) = NBIT                                                          
  2787. C UCLA FORMAT HEADER                                                            
  2788.       CALL CONVIC(IMGSIZ,CHR,16,4)                                              
  2789.       CALL BUFFWR(CHR,16,IFRMT)                                                 
  2790.       GO TO 20                                                                  
  2791. C MFE FORMAT HEADER                                                             
  2792.    10 CHR(1) = CHAR(0)                                                          
  2793.       IF ((LX.EQ.320).AND.(LY.EQ.200).AND.(NBIT.EQ.2)) CHR(1)=CHAR(241)         
  2794.       IF ((LX.EQ.640).AND.(LY.EQ.350).AND.(NBIT.EQ.1)) CHR(1)=CHAR(242)         
  2795.       IF ((LX.EQ.320).AND.(LY.EQ.200).AND.(NBIT.EQ.8)) CHR(1)=CHAR(243)         
  2796.       CALL BUFFWR(CHR,1,IFRMT)                                                  
  2797.    20 RETURN                                                                    
  2798.       END                                                                       
  2799. *                                                                               
  2800. *****************************************************                           
  2801. * wrpal -- write palette for mve vga format files                               
  2802. *****************************************************                           
  2803. *                                                                               
  2804.       SUBROUTINE WRPAL(PAL,NPAL,IFRMT)                                          
  2805. C THIS SUBROUTINE WRITES PALETTE FOR MFE VGA FORMAT FILES                       
  2806.       CHARACTER*1 PAL(768)                                                      
  2807.       CHARACTER*1 COLOR(24)                                                     
  2808.       CHARACTER*1 CHR                                                           
  2809.       DIMENSION ICOLOR(24)                                                      
  2810.       SAVE ICOLOR                                                               
  2811.       DATA ICOLOR /0,0,0,0,0,1,0,1,0,0,1,1,1,0,0,1,0,1,1,1,0,1,1,1/             
  2812.       IF (IFRMT.NE.4) GO TO 80                                                  
  2813. C WRITE DEFAULT PALETTE FOR VGA MODE                                            
  2814.       CHR = CHAR(240)                                                           
  2815.       CALL BUFFWR(CHR,1,IFRMT)                                                  
  2816.       IF (NPAL.GT.0) GO TO 40                                                   
  2817.          DO 10 I = 1, 24                                                        
  2818.             COLOR(I) = CHAR(63*ICOLOR(I))                                       
  2819.    10    CONTINUE                                                               
  2820.       CALL BUFFWR(COLOR,24,IFRMT)                                               
  2821.          DO 20 I = 1, 24                                                        
  2822.             COLOR(I) = CHAR(63)                                                 
  2823.    20    CONTINUE                                                               
  2824.          DO 30 I = 1, 31                                                        
  2825.             CALL BUFFWR(COLOR,24,IFRMT)                                         
  2826.    30    CONTINUE                                                               
  2827.       GO TO 80                                                                  
  2828. C WRITE USER PALETTE FOR VGA MODE                                               
  2829.    40 LEN = 3*NPAL                                                              
  2830.       IF (LEN.GT.768) LEN = 768                                                 
  2831.       CALL BUFFWR(PAL,LEN,IFRMT)                                                
  2832.       IF (LEN.EQ.768) GO TO 80                                                  
  2833. C PAD PALETTE WITH WHITE                                                        
  2834.       NL = (768 - LEN)                                                          
  2835.       N = NL/24                                                                 
  2836.       NL = NL - 24*N                                                            
  2837.       DO 50 I = 1, 24                                                           
  2838.       COLOR(I) = CHAR(63)                                                       
  2839.    50 CONTINUE                                                                  
  2840. C     write( 6,* ) ' n = ', n                                                   
  2841.       IF (N.EQ.0) GO TO 70                                                      
  2842.       DO 60 I = 1, N                                                            
  2843.       CALL BUFFWR(COLOR,24,IFRMT)                                               
  2844.    60 CONTINUE                                                                  
  2845.    70 IF (NL.GT.0) CALL BUFFWR(COLOR,NL,IFRMT)                                  
  2846.    80 RETURN                                                                    
  2847.       END                                                                       
  2848. *                                                                               
  2849. *****************************************************                           
  2850. * GIMAGE -- COMPRESSES CHARACTER IMAGE DATA INTO CHARACTER DATA                 
  2851. *****************************************************                           
  2852. *                                                                               
  2853.       SUBROUTINE GIMAGE (G,IMAGE,LX,LY,LZ,NBIT,INTRL)                           
  2854. C THIS SUBROUTINE COMPRESSES CHARACTER IMAGE DATA INTO CHARACTER DATA           
  2855. C NBIT = NUMBER OF BITS PER PIXEL                                               
  2856. C LZ = (LX - 1)/NPIX + 1, WHERE NPIX = 8/NBIT                                   
  2857.       CHARACTER*1 G(LX,LY)                                                      
  2858.       CHARACTER*1 BLANK                                                         
  2859.       CHARACTER*1 IMAGE(LZ,LY)                                                  
  2860. C     DATA BLANK /' '/                                                          
  2861.       BLANK = CHAR(0)                                                           
  2862.       NPIX = 8/NBIT                                                             
  2863.       NTC = 2**NBIT                                                             
  2864.       LY1 = LY + 1                                                              
  2865.       LYH = (LY - 1)/2 + 1                                                      
  2866.       DO 40 K = 1, LY                                                           
  2867.          K1 = LY1 - K                                                           
  2868.          K2 = K                                                                 
  2869.          K3 = (K - 1)/2                                                         
  2870.          IF (INTRL.EQ.1) K2 = LYH*((K2 - 1) - 2*K3) + K3 + 1                    
  2871.          DO 30 J = 1, LZ                                                        
  2872.             J1 = (J - 1)*NPIX                                                   
  2873.             ITC = 0                                                             
  2874.             DO 20 I = 1, NPIX                                                   
  2875.                IT = 0                                                           
  2876.                J2 = J1 + I                                                      
  2877.                IF (J2.GT.LX) GO TO 10                                           
  2878. C     IF (G(J2,K1).NE.BLANK) IT = 1                                             
  2879.                IS = ICHAR(G(J2,K1))                                             
  2880.                IT = IS - (IS/NTC)*NTC                                           
  2881.    10          ITC = NTC*ITC + IT                                               
  2882.    20       CONTINUE                                                            
  2883.             IMAGE(J,K2) = CHAR(ITC)                                             
  2884.    30    CONTINUE                                                               
  2885.    40 CONTINUE                                                                  
  2886.       RETURN                                                                    
  2887.       END                                                                       
  2888. *                                                                               
  2889. *****************************************************                           
  2890. * GRIMAGE -- COMPRESSES CHARACTER IMAGE DATA INTO CHARACTER DATA                
  2891. * THIS ROUTINE COMPRESSES THE STUFF FROM G INTO IMAGE                           
  2892. *****************************************************                           
  2893. *                                                                               
  2894.       SUBROUTINE GRIMAGE (G,IMAGE,NX,NY,NXV,LX,LY,LZ,NBIT,INTRL,IREV)           
  2895. C THIS SUBROUTINE COMPRESSES CHARACTER IMAGE DATA INTO CHARACTER DATA           
  2896. C IF LX < NX OR LY < NY, THEN IMAGE IS TRUNCATED                                
  2897. C IF LX > NX OR LY > NY, THEN IMAGE IS PADDED WITH NULLS                        
  2898. C NBIT = NUMBER OF BITS PER PIXEL                                               
  2899. C LZ = (LX - 1)/NPIX + 1, WHERE NPIX = 8/NBIT                                   
  2900. C INTRL = (0,1) = (NO,YES) INTERLACE IMAGE                                      
  2901. C IREV = (0,1) = (NO,YES) FLIP IMAGE VERTICALLY                                 
  2902.       CHARACTER*1 G(NXV,NY)                                                     
  2903.       CHARACTER*1 BLANK                                                         
  2904.       CHARACTER*1 IMAGE(LZ,LY)                                                  
  2905. C     DATA BLANK /' '/                                                          
  2906.       BLANK = CHAR(0)                                                           
  2907.       NPIX = 8/NBIT                                                             
  2908.       NTC = 2**NBIT                                                             
  2909.       LY1 = LY + 1                                                              
  2910.       LYH = (LY - 1)/2 + 1                                                      
  2911.       IF (NY.LT.LY) LY1 = NY + 1                                                
  2912. C LOOP OVER ROWS                                                                
  2913.       DO 60 K = 1, LY                                                           
  2914.       K1 = K                                                                    
  2915.       IF (IREV.EQ.1) K1 = LY1 - K                                               
  2916.       K2 = K                                                                    
  2917.       K3 = (K - 1)/2                                                            
  2918.       IF (INTRL.EQ.1) K2 = LYH*((K2 - 1) - 2*K3) + K3 + 1                       
  2919.       IF ((K1.LT.1).OR.(K1.GT.NY)) GO TO 40                                     
  2920. C LOOP OVER COLUMNS                                                             
  2921.       DO 30 J = 1, LZ                                                           
  2922.       J1 = (J - 1)*NPIX                                                         
  2923.       ITC = 0                                                                   
  2924. C EXTRACT LOW ORDER NBITS FROM G ARRAY                                          
  2925.       DO 20 I = 1, NPIX                                                         
  2926.       IT = 0                                                                    
  2927.       J2 = J1 + I                                                               
  2928.       IF ((J2.GT.NX).OR.(J2.GT.LX)) GO TO 10                                    
  2929. C     IF (G(J2,K1).NE.BLANK) IT = 1                                             
  2930.       IS = ICHAR(G(J2,K1))                                                      
  2931.       IT = IS - (IS/NTC)*NTC                                                    
  2932.    10 ITC = NTC*ITC + IT                                                        
  2933.    20 CONTINUE                                                                  
  2934.       IMAGE(J,K2) = CHAR(ITC)                                                   
  2935.    30 CONTINUE                                                                  
  2936.       GO TO 60                                                                  
  2937. C PAD Y VALUES WITH NULLS                                                       
  2938.    40 ITC = 0                                                                   
  2939.       DO 50 J = 1, LZ                                                           
  2940.       IMAGE(J,K2) = CHAR(ITC)                                                   
  2941.    50 CONTINUE                                                                  
  2942.    60 CONTINUE                                                                  
  2943.       RETURN                                                                    
  2944.       END                                                                       
  2945. *                                                                               
  2946. *****************************************************                           
  2947. * PCTSAV -- COMPRESSES SUCCESSIVE IMAGES                                        
  2948. *****************************************************                           
  2949. *                                                                               
  2950.       SUBROUTINE PCTSAV(IMAGE,JMAGE,IMG,LINE,LIMG,IXOR,LZ,LY,LENB,LENG,L        
  2951.      1ZG,IFRMT,INTRL)                                                           
  2952. C THIS SUBROUTINE PERFORMS COMPRESSION OF SUCCESSIVE IMAGES.                    
  2953. C INPUT IS IN ARRAY IMAGE, AND COMPRESSED OUTPUT IS IN ARRAY IMG.               
  2954. C IF IXOR = 1, THEN THE CURRENT IMAGE IS XORED WITH THE PREVIOUS IMAGE          
  2955. C BEFORE COMPRESSION, AND THE CURRENT IMAGE IS SAVE IN THE ARRAY JMAGE.         
  2956. C LINE AND LIMG ARE SCRATCH ARRAYS NEEDED BY SUBROUTINE COMPRS                  
  2957.       CHARACTER*1 IMAGE(LENB), JMAGE(LENB)                                      
  2958.       CHARACTER*1 IMG(LENG), LINE(LZ), LIMG(LZG)                                
  2959.       CHARACTER*1 CHR(4)                                                        
  2960.    91 FORMAT(36H COMPRESSED IMAGE OVERFLOW, IBMAX = ,I20,8H LENG = ,I20)        
  2961. C COMPRESS IMAGE                                                                
  2962.       IF (INTRL.EQ.1) GO TO 10                                                  
  2963.       IF (IXOR.EQ.1) GO TO 20                                                   
  2964.       IF (IFRMT.EQ.3) CALL COPYIM(IMAGE,IMG,LENB,LENG,IBMAX)                    
  2965.       IF (IFRMT.NE.3) CALL COMPRS(IMAGE,IMG,LINE,LIMG,LZ,LY,LZ,LENB,LENG        
  2966.      1,LZG,IBMAX)                                                               
  2967.       IF (IBMAX.GT.LENG) WRITE (6,91) IBMAX, LENG                               
  2968.       GO TO 50                                                                  
  2969. C INTERLACED IMAGE                                                              
  2970.    10 LYH = LY/2                                                                
  2971.       LYH1 = (LY - 1)/2 + 1                                                     
  2972.       LEN = LZ*LYH1                                                             
  2973.       CALL COMPRS(IMAGE,IMG,LINE,LIMG,LZ,LYH1,LZ,LEN,LENG,LZG,IBMAX)            
  2974.       IMG(IBMAX) = CHAR(240)                                                    
  2975.       JBMAX = IBMAX                                                             
  2976.       IT1 = LEN + 1                                                             
  2977.       IT2 = IBMAX + 1                                                           
  2978.       LEN = LZ*LYH                                                              
  2979.       CALL COMPRS(IMAGE(IT1),IMG(IT2),LINE,LIMG,LZ,LYH,LZ,LEN,LENG,LZG,I        
  2980.      1BMAX)                                                                     
  2981.       IBMAX = IBMAX + JBMAX                                                     
  2982.       IF (IBMAX.GT.LENG) WRITE (6,91) IBMAX, LENG                               
  2983.       GO TO 60                                                                  
  2984. C XOR AND COMPRESS SUCCESSIVE IMAGES                                            
  2985.    20 DO 30 I = 1, LENB                                                         
  2986.       JMAGE(I) = CHAR(IEOR(ICHAR(IMAGE(I)),ICHAR(JMAGE(I))))                    
  2987. C     JMAGE(I) = CHAR(ICHAR(IMAGE(I)).XOR.ICHAR(JMAGE(I)))                      
  2988.    30 CONTINUE                                                                  
  2989.       IF (IFRMT.EQ.3) CALL COPYIM(JMAGE,IMG,LENB,LENG,IBMAX)                    
  2990.       IF (IFRMT.NE.3) CALL COMPRS(JMAGE,IMG,LINE,LIMG,LZ,LY,LZ,LENB,LENG        
  2991.      1,LZG,IBMAX)                                                               
  2992.       IF (IBMAX.GT.LENG) WRITE (6,91) IBMAX, LENG                               
  2993. C SAVE OLD IMAGE                                                                
  2994.       DO 40 I = 1, LENB                                                         
  2995.       JMAGE(I) = IMAGE(I)                                                       
  2996.    40 CONTINUE                                                                  
  2997. C WRITE COMPRESSED IMAGE TO DISK                                                
  2998.    50 IF (IFRMT.EQ.4) GO TO 60                                                  
  2999.       CALL CONVIC(IBMAX,CHR,4,1)                                                
  3000.       CALL BUFFWR(CHR,4,IFRMT)                                                  
  3001.    60 CALL BUFFWR(IMG,IBMAX,IFRMT)                                              
  3002.       RETURN                                                                    
  3003.       END                                                                       
  3004. *                                                                               
  3005. *****************************************************                           
  3006. * COPYIM -- MOVES CHARACTER DATA FROM IMAGE TO IMG                              
  3007. *****************************************************                           
  3008. *                                                                               
  3009.       SUBROUTINE COPYIM (IMAGE,IMG,LMAX,LMAXG,IB)                               
  3010. C THIS SUBROUTINE MOVES CHARACTER DATA FROM ARRAY IMAGE TO IMG                  
  3011.       CHARACTER*1 IMAGE(LMAX), IMG(LMAXG)                                       
  3012.       IB = LMAX                                                                 
  3013.          DO 10 I = 1, IB                                                        
  3014.             IMG(I) = IMAGE(I)                                                   
  3015.    10    CONTINUE                                                               
  3016.       RETURN                                                                    
  3017.       END                                                                       
  3018. *                                                                               
  3019. *****************************************************                           
  3020. * COMPRS -- COMPRESSES BINARY DATA                                              
  3021. *****************************************************                           
  3022. *                                                                               
  3023.       SUBROUTINE COMPRS (IMAGE,IMG,LINE,LIMG,LENL,NUML,LENV,LMAX,LMAXG,L        
  3024.      1ENLG,IB)                                                                  
  3025. C THIS SUBROUTINE COMPRESSES BINARY DATA, USING THE ALGORITHM                   
  3026. C BY R. H. FROBOSE, JR., LAWRENCE LIVERMORE LAB REPORT UCRL-51858               
  3027. C WRITTEN BY VIKTOR K. DECYK, UCLA                                              
  3028. C INPUT IS IN ARRAY IMAGE, OF SIZE LMAX = LENV*NUML, WHERE                      
  3029. C LENV = SPACING BETWEEN ROWS IN BYTES, NUML = NUMBER OF LINES                  
  3030. C LENL = LENGTH OF LINE IN BYTES                                                
  3031. C OUTPUT IS IN ARRAY IMG, OF MAXIMUM SIZE LMAXG = LMAX+(LMAX-1)/3+1,            
  3032. C AND ACTUAL SIZE GIVEN IN VARIABLE IB                                          
  3033. C LINE AND LIMG ARE SCRATCH ARRAYS, OF SIZE LENL AND LENLG RESPECTIVELY,        
  3034. C WHERE LENLG = LENL+(LENL-1)/3+1                                               
  3035.       CHARACTER*1 IMAGE(LMAX), IMG(LMAXG), LINE(LENL), LIMG(LENLG)              
  3036.       INTEGER IC0,IC1,IC2,IC3                                                   
  3037.       SAVE ICN,IC0,IC1,IC2,IC3,ISTYLE                                           
  3038.       DATA ICN,IC0,IC1,IC2,IC3 /64,0,64,128,192/                                
  3039. C ISTYLE = (0,1,2) = (NO XOR,XOR,BOTH) SUCCESSIVE LINES                         
  3040.       DATA ISTYLE /2/                                                           
  3041.       ICNR = ICN/2 - 2                                                          
  3042. C PREVENT XOR ON FIRST LINE                                                     
  3043.       IB = LMAX                                                                 
  3044.       IB0 = 0                                                                   
  3045.       IL = 0                                                                    
  3046.       GO TO 120                                                                 
  3047.    10 IF (IXOR.EQ.1) GO TO 100                                                  
  3048.       IF ((ISTYLE.GT.0).AND.(LIB.GT.(IB-IB0))) GO TO 30                         
  3049. C XORED LINE IS LONGER                                                          
  3050.       DO 20 J = 1, LIB                                                          
  3051.       IMG(J+IB0) = LIMG(J)                                                      
  3052.    20 CONTINUE                                                                  
  3053.       IB = IB0 + LIB                                                            
  3054. C START NEW LINE                                                                
  3055.    30 IL = IL + LENV                                                            
  3056.       IF (IL.GE.LMAX) GO TO 450                                                 
  3057. C LOOKING FOR IDENTICAL LINES                                                   
  3058.       IRL = 0                                                                   
  3059.       IL1 = IL - LENV                                                           
  3060.       I = 0                                                                     
  3061.    40 IF (I.EQ.LENL) GO TO 50                                                   
  3062.       I = I + 1                                                                 
  3063.       IF (IMAGE(I+IL).EQ.IMAGE(I+IL1)) GO TO 40                                 
  3064. C LINE NOT IDENTICAL                                                            
  3065.       IF (IRL.EQ.0) GO TO 60                                                    
  3066. C REPEAT PREVIOUS LINE IRL TIMES.  DIFFERENT LINE FOLLOWS.                      
  3067.       IB = IB + 1                                                               
  3068.       ITC = IC3 + IRL                                                           
  3069.       IMG(IB) = CHAR(ITC)                                                       
  3070.       GO TO 60                                                                  
  3071. C LINE IDENTICAL                                                                
  3072.    50 IRL = IRL + 1                                                             
  3073.       IL = IL + LENV                                                            
  3074.       I = 0                                                                     
  3075.       IF ((IL.LT.LMAX).AND.(IRL.LT.ICNR)) GO TO 40                              
  3076. C REPEAT PREVIOUS LINE IRL TIMES.  BUFFER FULL.                                 
  3077.       IB = IB + 1                                                               
  3078.       ITC = IC3 + IRL                                                           
  3079.       IMG(IB) = CHAR(ITC)                                                       
  3080.       IF (IL.GE.LMAX) GO TO 450                                                 
  3081.       IRL = 0                                                                   
  3082.       I = 0                                                                     
  3083.       GO TO 40                                                                  
  3084. C TEST WHETHER TO SKIP XOR                                                      
  3085.    60 IB0 = IB                                                                  
  3086.       IF (ISTYLE.EQ.0) GO TO 120                                                
  3087. C  XOR CURRENT LINE                                                             
  3088.       IL1 = IL - LENV                                                           
  3089.       DO 70 I = 1, LENL                                                         
  3090.       LINE(I) = CHAR(IEOR(ICHAR(IMAGE(I+IL)),ICHAR(IMAGE(I+IL1))))              
  3091. C     LINE(I) = CHAR(ICHAR(IMAGE(I+IL)).XOR.ICHAR(IMAGE(I+IL1)))                
  3092.    70 CONTINUE                                                                  
  3093.       LIB = 1                                                                   
  3094.       ITC = IC3 + ICNR + 1                                                      
  3095.       LIMG(LIB) = CHAR(ITC)                                                     
  3096.       IXOR = 1                                                                  
  3097.       GO TO 140                                                                 
  3098. C SECOND PASS                                                                   
  3099. C SAVE PREVIOUS COMPRESSED LINE                                                 
  3100.   100 DO 110 J = 1, LIB                                                         
  3101.       IMG(J+IB) = LIMG(J)                                                       
  3102.   110 CONTINUE                                                                  
  3103.       IB = IB + LIB                                                             
  3104. C TEST WHETHER TO PERFORM XOR                                                   
  3105.       IF (ISTYLE.EQ.1) GO TO 30                                                 
  3106.   120 DO 130 I = 1, LENL                                                        
  3107.       LINE(I) = IMAGE(I+IL)                                                     
  3108.   130 CONTINUE                                                                  
  3109.       LIB = 0                                                                   
  3110.       IXOR = 0                                                                  
  3111.   140 I = 1                                                                     
  3112.       IZ = 0                                                                    
  3113.       ID = 0                                                                    
  3114.   150 IF (LINE(I).EQ.CHAR(0)) GO TO 400                                         
  3115. C NON-ZERO BYTES                                                                
  3116. C LOOKING FOR DIFFERENT BYTES                                                   
  3117.   200 ID = ID + 1                                                               
  3118.       IF (I.EQ.LENL) GO TO 260                                                  
  3119.       IF (ID.EQ.ICN) GO TO 240                                                  
  3120.       I = I + 1                                                                 
  3121.       IF (LINE(I).NE.CHAR(0)) GO TO 205                                         
  3122.       IF ((I.EQ.LENL).OR.(LINE(I+1).NE.CHAR(0))) GO TO 200                      
  3123.       GO TO 220                                                                 
  3124.   205 IF (LINE(I).NE.LINE(I-1)) GO TO 200                                       
  3125.       IF (ID.EQ.1) GO TO 300                                                    
  3126.       IF ((I.EQ.LENL).OR.(LINE(I+1).NE.LINE(I))) GO TO 200                      
  3127.       ID = ID - 1                                                               
  3128. C PLOT NEXT ID BYTES AS THEY APPEAR. PAIR FOLLOWS.                              
  3129.       LIB = LIB + 1                                                             
  3130.       ITC = IC2 + ID - 1                                                        
  3131.       LIMG(LIB) = CHAR(ITC)                                                     
  3132.       I1 = (I - ID - 2)                                                         
  3133.       DO 210 J = 1, ID                                                          
  3134.       LIMG(J+LIB) = LINE(J+I1)                                                  
  3135.   210 CONTINUE                                                                  
  3136.       LIB = LIB + ID                                                            
  3137.       GO TO 300                                                                 
  3138. C PLOT NEXT ID BYTES AS THEY APPEAR. ZERO FOLLOWS.                              
  3139.   220 LIB = LIB + 1                                                             
  3140.       ITC = IC2 + ID - 1                                                        
  3141.       LIMG(LIB) = CHAR(ITC)                                                     
  3142.       I1 = (I - ID - 1)                                                         
  3143.       DO 230 J = 1, ID                                                          
  3144.       LIMG(J+LIB) = LINE(J+I1)                                                  
  3145.   230 CONTINUE                                                                  
  3146.       LIB = LIB + ID                                                            
  3147.       ID = 0                                                                    
  3148.       GO TO 400                                                                 
  3149. C PLOT NEXT ID BYTES AS THEY APPEAR.  BUFFER FULL.                              
  3150.   240 LIB = LIB + 1                                                             
  3151.       ITC = IC2 + ID - 1                                                        
  3152.       LIMG(LIB) = CHAR(ITC)                                                     
  3153.       I1 = (I - ID)                                                             
  3154.       DO 250 J = 1, ID                                                          
  3155.       LIMG(J+LIB) = LINE(J+I1)                                                  
  3156.   250 CONTINUE                                                                  
  3157.       LIB = LIB + ID                                                            
  3158.       I = I + 1                                                                 
  3159.       ID = 0                                                                    
  3160.       GO TO 150                                                                 
  3161. C PLOT NEXT ID BYTES AS THEY APPEAR.  LINE FULL.                                
  3162.   260 LIB = LIB + 1                                                             
  3163.       ITC = IC2 + ID - 1                                                        
  3164.       LIMG(LIB) = CHAR(ITC)                                                     
  3165.       I1 = (I - ID)                                                             
  3166.       DO 270 J = 1, ID                                                          
  3167.       LIMG(J+LIB) = LINE(J+I1)                                                  
  3168.   270 CONTINUE                                                                  
  3169.       LIB = LIB + ID                                                            
  3170.       GO TO 10                                                                  
  3171. C NON-ZERO BYTES                                                                
  3172. C LOOKING FOR IDENTICAL BYTES                                                   
  3173.   300 IR = 1                                                                    
  3174.   310 IR = IR + 1                                                               
  3175.       IF (I.EQ.LENL) GO TO 330                                                  
  3176.       IF (IR.EQ.ICN) GO TO 320                                                  
  3177.       I = I + 1                                                                 
  3178.       IF (LINE(I).EQ.LINE(I-1)) GO TO 310                                       
  3179. C REPEAT NEXT BYTE IR TIMES.  DIFFERENT BYTE FOLLOWS.                           
  3180.       LIB = LIB + 1                                                             
  3181.       ITC = IC0 + IR - 1                                                        
  3182.       LIMG(LIB) = CHAR(ITC)                                                     
  3183.       LIB = LIB + 1                                                             
  3184.       LIMG(LIB) = LINE(I-1)                                                     
  3185.       ID = 0                                                                    
  3186.       GO TO 150                                                                 
  3187. C REPEAT NEXT BYTE IR TIMES.  BUFFER FULL.                                      
  3188.   320 LIB = LIB + 1                                                             
  3189.       ITC = IC0 + IR - 1                                                        
  3190.       LIMG(LIB) = CHAR(ITC)                                                     
  3191.       LIB = LIB + 1                                                             
  3192.       LIMG(LIB) = LINE(I)                                                       
  3193.       I = I + 1                                                                 
  3194.       ID = 0                                                                    
  3195.       GO TO 150                                                                 
  3196. C REPEAT NEXT BYTE IR TIMES.  LINE FULL.                                        
  3197.   330 LIB = LIB + 1                                                             
  3198.       ITC = IC0 + IR - 1                                                        
  3199.       LIMG(LIB) = CHAR(ITC)                                                     
  3200.       LIB = LIB + 1                                                             
  3201.       LIMG(LIB) = LINE(I)                                                       
  3202.       GO TO 10                                                                  
  3203. C ZERO BYTES                                                                    
  3204.   400 IZ = IZ + 1                                                               
  3205.       IF (I.EQ.LENL) GO TO 430                                                  
  3206.       I = I + 1                                                                 
  3207.       IF (LINE(I).EQ.CHAR(0)) GO TO 400                                         
  3208.   410 IF (IZ.LE.ICN) GO TO 420                                                  
  3209. C SKIP NEXT IZ BYTES, AND PLOT THE FOLLOWING BYTE.  BUFFER FULL.                
  3210.       LIB = LIB + 1                                                             
  3211.       ITC = IC1 + ICN - 1                                                       
  3212.       LIMG(LIB) = CHAR(ITC)                                                     
  3213.       LIB = LIB + 1                                                             
  3214.       LIMG(LIB) = CHAR(0)                                                       
  3215.       IZ = IZ - (ICN + 1)                                                       
  3216.       IF (IZ.EQ.0) GO TO 200                                                    
  3217.       GO TO 410                                                                 
  3218. C SKIP NEXT IZ BYTES, AND PLOT THE FOLLOWING BYTE.  NEXT BYTE NON-ZERO.         
  3219.   420 LIB = LIB + 1                                                             
  3220.       ITC = IC1 + IZ - 1                                                        
  3221.       LIMG(LIB) = CHAR(ITC)                                                     
  3222.       LIB = LIB + 1                                                             
  3223.       LIMG(LIB) = LINE(I)                                                       
  3224.       IF (I.EQ.LENL) GO TO 10                                                   
  3225.       I = I + 1                                                                 
  3226.       IZ = 0                                                                    
  3227.       GO TO 150                                                                 
  3228. C PLOT END-OF-LINE SENTINEL                                                     
  3229.   430 LIB = LIB + 1                                                             
  3230.       LIMG(LIB) = CHAR(IC3)                                                     
  3231.       GO TO 10                                                                  
  3232. C END-OF-FRAME BYTE                                                             
  3233.   450 IB = IB + 1                                                               
  3234.       IMG(IB) = CHAR(0)                                                         
  3235.       RETURN                                                                    
  3236.       END                                                                       
  3237. *                                                                               
  3238. *****************************************************                           
  3239. * BUFFWR -- PACKS IMAGE INTO BUFFER AND WRITES WHEN FULL                        
  3240. *****************************************************                           
  3241. *                                                                               
  3242.       SUBROUTINE BUFFWR(LINE,N,IFRMT)                                           
  3243. C THIS SUBROUTINE PACKS IMAGE DATA INTO BUFFER AND WRITES WHEN FULL             
  3244. C INPUT IS IN CHARACTER ARRAY LINE, AND N CHARACTERS ARE TO BE WRITTEN          
  3245.       CHARACTER*1 C0                                                            
  3246.       CHARACTER*1 LINE(*)                                                       
  3247.       CHARACTER*1 LOUT(80)                                                      
  3248.       DIMENSION IOUT(20)                                                        
  3249.       SAVE LEN,LMAX,LW,LOUT                                                     
  3250.       DATA LEN,LMAX,LW /0,80,4/                                                 
  3251.       L = (LMAX - 1)/LW + 1                                                     
  3252.       NC = N                                                                    
  3253.       NCR = N                                                                   
  3254.       I = 0                                                                     
  3255.       IF (N.GT.0) GO TO 10                                                      
  3256.       IF (LEN.GE.0) GO TO 60                                                    
  3257.       GO TO 70                                                                  
  3258.    10 NCR = (NC + LEN) - LMAX                                                   
  3259.       IF (NCR.GE.0) NC = LMAX - LEN                                             
  3260.    20 IF (LEN.GT.0) GO TO 40                                                    
  3261. C     C0 = CHAR(0)                                                              
  3262.       C0 = CHAR(232)                                                            
  3263.       DO 30 J = 1, LMAX                                                         
  3264.       LOUT(J) = C0                                                              
  3265.    30 CONTINUE                                                                  
  3266.    40 DO 50 J = 1, NC                                                           
  3267.       LOUT(J+LEN) = LINE(I+J)                                                   
  3268.    50 CONTINUE                                                                  
  3269.       I = I + NC                                                                
  3270.       LEN = LEN + NC                                                            
  3271.       IF (NCR.LT.0) GO TO 70                                                    
  3272.    60 ITC = LEN                                                                 
  3273.       IF (IFRMT.EQ.4) ITC = LMAX                                                
  3274.       IF (LEN.GT.0) CALL PCTOUT(LOUT,IOUT,ITC,L,IFRMT)                          
  3275.       LEN = 0                                                                   
  3276.       IF (N.EQ.0) CALL PCTOUT(LOUT,IOUT,LEN,L,IFRMT)                            
  3277.       IF (NCR.EQ.0) GO TO 70                                                    
  3278.       NC = NCR                                                                  
  3279.       NCR = NCR - LMAX                                                          
  3280.       IF (NCR.GE.0) NC = LMAX                                                   
  3281.       GO TO 20                                                                  
  3282.    70 RETURN                                                                    
  3283.       END                                                                       
  3284. *                                                                               
  3285. *****************************************************                           
  3286. * PCTOUT -- WRITES COMPRESSED RASTER FILE IN APPROP FORM                        
  3287. *****************************************************                           
  3288. *                                                                               
  3289.       SUBROUTINE PCTOUT(LOUT,IOUT,LEN,N,IFRMT)                                  
  3290. C THIS SUBROUTINE WRITES COMPRESSED RASTER FILE IN APPROPRIATE FORM             
  3291.       CHARACTER*1 LOUT(*)                                                       
  3292.       DIMENSION IOUT(N)                                                         
  3293.    91 FORMAT (80A1)                                                             
  3294. C IFRMT = 2 = ENCRYPT THE FILE                                                  
  3295.       IF (IFRMT.EQ.2) GO TO 10                                                  
  3296.       IF (LEN.GT.0) WRITE (19,91) (LOUT(J),J=1,LEN)                             
  3297.       GO TO 20                                                                  
  3298.    10 CALL CONVCI(LOUT,IOUT,LEN,N)                                              
  3299.       CALL ENCODE(IOUT,LEN)                                                     
  3300.    20 RETURN                                                                    
  3301.       END                                                                       
  3302. *                                                                               
  3303. *****************************************************                           
  3304. * CONVIC -- CONVERTS PACKED INTEGER TO CHARACTER DATA                           
  3305. *****************************************************                           
  3306. *                                                                               
  3307.       SUBROUTINE CONVIC(LIN,CHR,LEN,N)                                          
  3308. C THIS SUBROUTINE CONVERTS PACKED INTEGER TO CHARACTER DATA                     
  3309. C SHOULD HAVE N = (LEN - 1)/LW + 1                                              
  3310. C DIMENSION LB(LW)                                                              
  3311. C MW = -2**(8*LW-1)                                                             
  3312.       CHARACTER*1 CHR(LEN)                                                      
  3313.       DIMENSION LIN(N)                                                          
  3314.       DIMENSION LB(4)                                                           
  3315.       SAVE LW,NW                                                                
  3316.       DATA LW,NW /4,-2147483647/                                                
  3317.       IF (LEN.LT.1) GO TO 70                                                    
  3318.       MW = NW - 1                                                               
  3319.       L = (LEN - 1)/LW + 1                                                      
  3320.       M = LEN/LW                                                                
  3321.       MR = LEN - M*LW                                                           
  3322.       LWM = LW - 1                                                              
  3323.       LWP = LW + 1                                                              
  3324.       IF (M.EQ.0) GO TO 40                                                      
  3325.       DO 30 I = 1, M                                                            
  3326.       I1 = (I - 1)*LW                                                           
  3327.       LB(1) = LIN(I)                                                            
  3328.       IF (LB(1).LT.0) LB(1) = LB(1) - MW                                        
  3329.       DO 10 J = 1, LWM                                                          
  3330.       LB(J+1) = LB(J)/256                                                       
  3331.       LB(J) = LB(J) - LB(J+1)*256                                               
  3332.    10 CONTINUE                                                                  
  3333.       IF (LIN(I).LT.0) LB(LW) = LB(LW) + 128                                    
  3334.       DO 20 J = 1, LW                                                           
  3335.       CHR(I1 + J) = CHAR(LB(LWP - J))                                           
  3336.    20 CONTINUE                                                                  
  3337.    30 CONTINUE                                                                  
  3338.    40 IF (MR.EQ.0) GO TO 70                                                     
  3339.       I1 = M*LW                                                                 
  3340.       LB(1) = LIN(L)                                                            
  3341.       IF (LB(1).LT.0) LB(1) = LB(1) - MW                                        
  3342.       DO 50 J = 1, LWM                                                          
  3343.       LB(J+1) = LB(J)/256                                                       
  3344.       LB(J) = LB(J) - LB(J+1)*256                                               
  3345.    50 CONTINUE                                                                  
  3346.       IF (LIN(L).LT.0) LB(LW) = LB(LW) + 128                                    
  3347.       DO 60 J = 1, MR                                                           
  3348.       CHR(I1 + J) = CHAR(LB(LWP - J))                                           
  3349.    60 CONTINUE                                                                  
  3350.    70 RETURN                                                                    
  3351.       END                                                                       
  3352. *                                                                               
  3353. *****************************************************                           
  3354. * CONVCI -- CONVERTS CHARACTER DATA TO PACKED INTEGER                           
  3355. *****************************************************                           
  3356. *                                                                               
  3357.       SUBROUTINE CONVCI(CHR,LOUT,LEN,N)                                         
  3358. C THIS SUBROUTINE CONVERTS CHARACTER DATA TO PACKED INTEGER                     
  3359. C SHOULD HAVE N = (LEN - 1)/LW + 1                                              
  3360.       CHARACTER*1 CHR(*)                                                        
  3361.       DIMENSION LOUT(N)                                                         
  3362.       SAVE LW,NW                                                                
  3363.       DATA LW,NW /4,-2147483647/                                                
  3364.       IF (LEN.LT.1) GO TO 60                                                    
  3365.       MW = NW - 1                                                               
  3366.       L = (LEN - 1)/LW + 1                                                      
  3367.       M = LEN/LW                                                                
  3368.       MR = LEN - M*LW                                                           
  3369.       LW1 = LW - 1                                                              
  3370.       IF (M.EQ.0) GO TO 30                                                      
  3371.       DO 20 J = 1, M                                                            
  3372.       J1 = (J - 1)*LW + 1                                                       
  3373.       ITC = ICHAR(CHR(J1))                                                      
  3374.       LOUT(J) = ITC                                                             
  3375.       IF (ITC.GE.128) LOUT(J) = LOUT(J) - 128                                   
  3376.       DO 10 I = 1, LW1                                                          
  3377.       LOUT(J) = ICHAR(CHR(J1+I)) + 256*LOUT(J)                                  
  3378.    10 CONTINUE                                                                  
  3379.       IF (ITC.GE.128) LOUT(J) = LOUT(J) + MW                                    
  3380.    20 CONTINUE                                                                  
  3381.    30 IF (MR.EQ.0) GO TO 60                                                     
  3382.       J1 = M*LW + 1                                                             
  3383.       ITC = ICHAR(CHR(J1))                                                      
  3384.       LOUT(L) = ITC                                                             
  3385.       IF (ITC.GE.128) LOUT(L) = LOUT(L) - 128                                   
  3386.       IF (MR.EQ.1) GO TO 50                                                     
  3387.       MR1 = MR - 1                                                              
  3388.       DO 40 I = 1, MR1                                                          
  3389.       LOUT(L) = ICHAR(CHR(J1+I)) + 256*LOUT(L)                                  
  3390.    40 CONTINUE                                                                  
  3391.    50 IT1 = 256**(LW*L - LEN)                                                   
  3392.       LOUT(L) = IT1*LOUT(L)                                                     
  3393.       IF (ITC.GE.128) LOUT(L) = LOUT(L) + MW                                    
  3394.    60 RETURN                                                                    
  3395.       END                                                                       
  3396. *                                                                               
  3397. *****************************************************                           
  3398. * ENCODE -- ENCODES BINARY TO ASCII                                             
  3399. *****************************************************                           
  3400. *                                                                               
  3401.       SUBROUTINE ENCODE (LIN,LEN)                                               
  3402. C THIS SUBROUTINE ENCODES BINARY TO ASCII                                       
  3403. C WRITTEN FOR THE IBM 3090 VF - VIKTOR K. DECYK, UCLA                           
  3404. C DIMENSION LB(LW), IA(IB+1), LA > = 64                                         
  3405. C MW = -2**(8*LW-1)                                                             
  3406.       DIMENSION LIN(1)                                                          
  3407.       DIMENSION LB(4), IA(4)                                                    
  3408.       SAVE LW,NW,IB,LA,IS,IA,K                                                  
  3409.       DATA LW,NW,IB,LA,IS,K /4,-2147483647,3,83,34,1/                           
  3410.       IF (LEN.LT.1) GO TO 70                                                    
  3411.       MW = NW - 1                                                               
  3412.       L = (LEN - 1)/LW + 1                                                      
  3413.       LWM = LW - 1                                                              
  3414.       LWP = LW + 1                                                              
  3415.       IC = IB + 1                                                               
  3416.       LS = 256**(LW - IC)                                                       
  3417.       DO 60 I = 1, L                                                            
  3418.       LB(1) = LIN(I)                                                            
  3419.       IF (LB(1).LT.0) LB(1) = LB(1) - MW                                        
  3420.       DO 10 J = 1, LWM                                                          
  3421.       LB(J+1) = LB(J)/256                                                       
  3422.       LB(J) = LB(J) - LB(J+1)*256                                               
  3423.    10 CONTINUE                                                                  
  3424.       IF (LIN(I).LT.0) LB(LW) = LB(LW) + 128                                    
  3425.       DO 50 J = 1, LW                                                           
  3426.       IA(K) = LB(LWP - J)                                                       
  3427.       II = IA(K)                                                                
  3428. C     IF (II.EQ.0) GO TO 50                                                     
  3429.       K = K + 1                                                                 
  3430.       IF (K.LE.IB) GO TO 50                                                     
  3431.       LINE = 0                                                                  
  3432.       DO 20 JJ = 1, IB                                                          
  3433.       LINE = IA(JJ) + 256*LINE                                                  
  3434.    20 CONTINUE                                                                  
  3435.       IA(IC) = LINE                                                             
  3436.       DO 30 JJ = 1, IB                                                          
  3437.       J1 = IC - JJ                                                              
  3438.       IA(J1) = IA(J1+1)/LA                                                      
  3439.       IA(J1+1) = IA(J1+1) - IA(J1)*LA                                           
  3440.    30 CONTINUE                                                                  
  3441.       LINE = 0                                                                  
  3442.       DO 40 JJ = 1, IC                                                          
  3443.       IA(JJ) = IA(JJ) + IS                                                      
  3444.       IF (IA(JJ).GT.90) IA(JJ) = IA(JJ) + 6                                     
  3445.       LINE = IA(JJ) + 256*LINE                                                  
  3446.    40 CONTINUE                                                                  
  3447.       LINE = LS*LINE                                                            
  3448.       CALL BUFFPK (LINE,IC)                                                     
  3449.       K = 1                                                                     
  3450.    50 CONTINUE                                                                  
  3451.    60 CONTINUE                                                                  
  3452.       GO TO 120                                                                 
  3453.    70 IC = K - 1                                                                
  3454.       IF (IC.LT.1) GO TO 110                                                    
  3455.       LINE = 0                                                                  
  3456.       DO 80 JJ = 1, IC                                                          
  3457.       LINE = IA(JJ) + 256*LINE                                                  
  3458.    80 CONTINUE                                                                  
  3459.       IC1 = IC + 1                                                              
  3460.       IA(IC1) = LINE                                                            
  3461.       DO 90 JJ = 1, IC                                                          
  3462.       J1 = IC1 - JJ                                                             
  3463.       IA(J1) = IA(J1+1)/LA                                                      
  3464.       IA(J1+1) = IA(J1+1) - IA(J1)*LA                                           
  3465.    90 CONTINUE                                                                  
  3466.       LINE = 0                                                                  
  3467.       DO 100 JJ = 1, IC1                                                        
  3468.       IA(JJ) = IA(JJ) + IS                                                      
  3469.       IF (IA(JJ).GT.90) IA(JJ) = IA(JJ) + 6                                     
  3470.       LINE = IA(JJ) + 256*LINE                                                  
  3471.   100 CONTINUE                                                                  
  3472.       LINE = LINE*256**(LW - IC1)                                               
  3473.       CALL BUFFPK (LINE,IC1)                                                    
  3474.       K = 1                                                                     
  3475.       IC = 0                                                                    
  3476.   110 CALL BUFFPK (LINE,IC)                                                     
  3477.   120 RETURN                                                                    
  3478.       END                                                                       
  3479. *                                                                               
  3480. *****************************************************                           
  3481. * BUFFPK                                                                        
  3482. *****************************************************                           
  3483. *                                                                               
  3484.       SUBROUTINE BUFFPK(LINE,N)                                                 
  3485. C DIMENSION LOUT((LMAX-1)/LW+2)                                                 
  3486.       DIMENSION LINE(1)                                                         
  3487.       DIMENSION LOUT(19)                                                        
  3488.       SAVE LEN,LMAX,LW,LOUT                                                     
  3489.       DATA LEN,LMAX,LW /0,72,4/                                                 
  3490.       DATA LOUT(1) /0/                                                          
  3491.       NC = N                                                                    
  3492.       NCR = N                                                                   
  3493.       IF (N.GT.0) GO TO 10                                                      
  3494.       IF (LEN.GT.0) GO TO 50                                                    
  3495.       GO TO 70                                                                  
  3496.    10 NCR = (NC + LEN) - LMAX                                                   
  3497.       IF (NCR.GE.0) NC = LMAX - LEN                                             
  3498.       M = LEN/LW                                                                
  3499.       L = LEN - LW*M                                                            
  3500.       LR = LW - L                                                               
  3501.       LS = 256**L                                                               
  3502.       LL = 1                                                                    
  3503.       IF (L.GT.0) LL = 256**LR                                                  
  3504.       NCT = NC                                                                  
  3505.       I = 1                                                                     
  3506.    20 LT = LINE(I)/LS                                                           
  3507.       LOUT(M+I) = LOUT(M+I) + LT                                                
  3508.       IF (NCT.LT.LR) GO TO 40                                                   
  3509.       LOUT(M+I+1) = (LINE(I) - LS*LT)*LL                                        
  3510.    30 IF (NCT.LE.LW) GO TO 40                                                   
  3511.       I = I + 1                                                                 
  3512.       NCT = NCT - LW                                                            
  3513.       GO TO 20                                                                  
  3514.    40 LEN = LEN + NC                                                            
  3515.       IF (NCR.LT.0) GO TO 70                                                    
  3516.    50 CALL TPUTC(LOUT,LEN)                                                      
  3517.       LEN = 0                                                                   
  3518.       IF (NCR.EQ.0) GO TO 60                                                    
  3519.       NC = NCR                                                                  
  3520.       NCR = NCR - LMAX                                                          
  3521.       IF (NCR.GE.0) NC = LMAX                                                   
  3522.       LOUT(1) = LOUT(M+I+1)                                                     
  3523.       M = -I                                                                    
  3524.       NCT = NCT + NC                                                            
  3525.       GO TO 30                                                                  
  3526.    60 LOUT(1) = 0                                                               
  3527.    70 RETURN                                                                    
  3528.       END                                                                       
  3529. *                                                                               
  3530. *****************************************************                           
  3531. * TPUTC  -- TRANSLATES ASCII TO EBCDIC                                          
  3532. *****************************************************                           
  3533. *                                                                               
  3534.       SUBROUTINE TPUTC(LOUT,LEN)                                                
  3535. C THIS SUBROUTINE TRANSLATES ASCII TO EBCDIC ACCORDING TO THE                   
  3536. C CONVENTIONS AT CORNELL CNSF'S IBM 3090VF AND WRITES RESULT TO METAFILE        
  3537. C VIKTOR K. DECYK, UCLA                                                         
  3538. C DIMENSION LB(LW)                                                              
  3539. C MW = -2**(8*LW-1)                                                             
  3540.       DIMENSION LOUT(1)                                                         
  3541.       DIMENSION IATE(128), LB(4)                                                
  3542.       SAVE LW,NW,IATE                                                           
  3543.    91 FORMAT (18A4)                                                             
  3544.       DATA LW,NW /4,-2147483647/                                                
  3545. C EBCDIC CODE FOR ASCII 124 IS NON-STANDARD                                     
  3546.       DATA IATE /0,1,2,3,55,45,46,47,22,5,37,11,12,13,14,15,16,17,18,19,        
  3547.      160,61,50,38,24,25,63,39,34,29,53,31,64,90,127,123,91,108,80,125,77        
  3548.      2,93,92,78,107,96,75,97,240,241,242,243,244,245,246,247,248,249,122        
  3549.      3,94,76,126,110,111,124,193,194,195,196,197,198,199,200,201,209,210        
  3550.      4,211,212,213,214,215,216,217,226,227,228,229,230,231,232,233,173,2        
  3551.      524,189,95,109,121,129,130,131,132,133,134,135,136,137,145,146,147,        
  3552.      6148,149,150,151,152,153,162,163,164,165,166,167,168,169,192,79,208        
  3553.      7,161,7/                                                                   
  3554.       IF (LEN.LT.1) GO TO 40                                                    
  3555.       MW = NW - 1                                                               
  3556.       L = (LEN - 1)/LW + 1                                                      
  3557.       LW1 = LW - 1                                                              
  3558.       DO 30 I = 1, L                                                            
  3559.       LB(1) = LOUT(I)                                                           
  3560.       DO 10 J = 1, LW1                                                          
  3561.       LB(J+1) = LB(J)/256                                                       
  3562.       LB(J) = LB(J) - LB(J+1)*256                                               
  3563.    10 CONTINUE                                                                  
  3564.       IT1 = IATE(LB(LW)+1)                                                      
  3565.       IT2 = IT1                                                                 
  3566.       IF (IT1.GE.128) IT1 = IT1 - 128                                           
  3567.       DO 20 J = 1, LW1                                                          
  3568.       IT1 = IATE(LB(LW-J)+1) + 256*IT1                                          
  3569.    20 CONTINUE                                                                  
  3570.       LOUT(I) = IT1                                                             
  3571.       IF (IT2.GE.128) LOUT(I) = LOUT(I) + MW                                    
  3572.    30 CONTINUE                                                                  
  3573.       WRITE (19,91) (LOUT(J),J=1,L)                                             
  3574.    40 RETURN                                                                    
  3575.       END                                                                       
  3576. *                                                                               
  3577. *****************************************************                           
  3578. * startg -- initializes compressed raster device                                
  3579. *****************************************************                           
  3580. *                                                                               
  3581.       SUBROUTINE STARTG                                                         
  3582. C THIS SUBROUTINE INITIALIZES COMPRESSED RASTER DEVICE                          
  3583.       COMMON /GRDEV/ LX, LY, NBIT, IFRMT, INTRL, IXOR                           
  3584.       CHARACTER*1 C                                                             
  3585.       DIMENSION LXS(7), LYS(7), NBITS(4)                                        
  3586.       SAVE LXS,LYS,NBITS,ISTART                                                 
  3587.    91 FORMAT (61H ENTER (1,2,3,4) FOR (COMPRESSED,ENCODED,BINARY,MFE) FO        
  3588.      1RMAT: )                                                                   
  3589.    92 FORMAT (A1)                                                               
  3590.    93 FORMAT (75H ENTER (1,2,3,4,5,6,7) FOR (MACPLUS,MACII,CGA,EGA,3179G        
  3591.      1,ASCII,OTHER) SIZE: )                                                     
  3592.    94 FORMAT (33H ENTER IMAGE SIZE AS LX,LY PAIR: )                             
  3593.    95 FORMAT (42H ENTER (1,2,3,4) FOR (2,4,16,256) COLORS: )                    
  3594.    96 FORMAT (39H ENTER (1,2,3) FOR (CGA,EGA,VGA) SIZE: )                       
  3595.    97 FORMAT (18H PROGRAM EXECUTING)                                            
  3596.       DATA LXS /512,640,320,640,720,79,1024/                                    
  3597.       DATA LYS /342,480,200,350,384,21,781/                                     
  3598.       DATA NBITS /1,2,4,8/                                                      
  3599.       DATA ISTART /0/                                                           
  3600.       IF (ISTART.NE.0) GO TO 90                                                 
  3601.       INTRL = 0                                                                 
  3602.       IXOR = 1                                                                  
  3603.       NPAL = 1                                                                  
  3604. C INQUIRE FORMAT TYPE                                                           
  3605. 10    C = '4'                                                                   
  3606. C     WRITE (6,91)                                                              
  3607. C     READ (5,92,END=15) C                                                      
  3608.    15 IFRMT = ICHAR(C) - ICHAR('0')                                             
  3609.       IF (IFRMT.EQ.0) GO TO 80                                                  
  3610.       IF ((IFRMT.LT.1).OR.(IFRMT.GT.4)) GO TO 10                                
  3611.       IF (IFRMT.EQ.4) GO TO 60                                                  
  3612.       IF (IFRMT.NE.2) GO TO 20                                                  
  3613. C     CLOSE(UNIT=10)                                                            
  3614. C     OPEN(UNIT=10,FILE='MOVIEF',FORM='FORMATTED',STATUS='UNKNOWN')             
  3615. C NOT MFE FORMAT                                                                
  3616. C FIRST, INQUIRE SCREEN SIZE                                                    
  3617. 20    continue                                                                  
  3618. C  20 WRITE (6,93)                                                              
  3619.       READ (5,92,END=25) C                                                      
  3620.    25 ID = ICHAR(C) - ICHAR('0')                                                
  3621.       IF (ID.EQ.0) GO TO 80                                                     
  3622.       IF ((ID.LT.1).OR.(ID.GT.7)) GO TO 20                                      
  3623.       LX = LXS(ID)                                                              
  3624.       LY = LYS(ID)                                                              
  3625.       IF (ID.LT.7) GO TO 40                                                     
  3626. C VARIABLE SCREEN SIZE                                                          
  3627. 30    continue                                                                  
  3628. C  30 WRITE (6,94)                                                              
  3629.       READ (5,*,END=35) LX, LY                                                  
  3630.    35 IF ((LX.LT.1).OR.(LX.GT.LXS(7))) GO TO 30                                 
  3631.       IF ((LY.LT.1).OR.(LY.GT.LYS(7))) GO TO 30                                 
  3632. C NEXT, INQUIRE NUMBER OF COLOR BITS                                            
  3633. 40    continue                                                                  
  3634. C  40 WRITE (6,95)                                                              
  3635.       READ (5,92,END=45) C                                                      
  3636.    45 ID = ICHAR(C) - ICHAR('0')                                                
  3637.       IF (ID.EQ.0) GO TO 80                                                     
  3638.       IF ((ID.LT.1).OR.(ID.GT.4)) GO TO 40                                      
  3639.       NBIT = NBITS(ID)                                                          
  3640.       GO TO 70                                                                  
  3641. C MFE FORMAT                                                                    
  3642. 60    continue                                                                  
  3643. C  60 WRITE (6,96)                                                              
  3644.       READ (5,92,END=65) C                                                      
  3645.    65 ID = ICHAR(C) - ICHAR('0')                                                
  3646.       IF (ID.EQ.0) GO TO 80                                                     
  3647.       IF ((ID.LT.1).OR.(ID.GT.3)) GO TO 60                                      
  3648.       IF (ID.EQ.1) NBIT = 2                                                     
  3649.       IF (ID.EQ.2) NBIT = 1                                                     
  3650.       IF (ID.EQ.3) NBIT = 8                                                     
  3651.       IF (ID.EQ.1) INTRL = 1                                                    
  3652.       IF (ID.EQ.3) NPAL = 0                                                     
  3653.       IF (ID.LT.3) ID = ID + 2                                                  
  3654.       LX = LXS(ID)                                                              
  3655.       LY = LYS(ID)                                                              
  3656.    70 IF ((IFRMT.EQ.1).OR.(IFRMT.EQ.2)) IXOR = 1                                
  3657.       IF ((IFRMT.EQ.3).OR.(IFRMT.EQ.4)) IXOR = 0                                
  3658.       CALL HEADER(IFRMT,LX,LY,NBIT)                                             
  3659.       IF (NPAL.EQ.0) CALL WRPAL(C,NPAL,IFRMT)                                   
  3660.       ISTART = 1                                                                
  3661.       GO TO 90                                                                  
  3662.    80 STOP 1                                                                    
  3663.    90 WRITE (6,97)                                                              
  3664.       END                                                                       
  3665. *                                                                               
  3666. *****************************************************                           
  3667. * GRPARM -- INITIALIZES GRAPHICS SIZE PARAMETERS                                
  3668. *****************************************************                           
  3669. *                                                                               
  3670.       SUBROUTINE GRPARM(IPARM,IRX,IRY,MNX,MNY,LNX,LNY,ICH,ICW,ISLB,ISTCX        
  3671.      1,ISTCY,NTCX,NTCY,IGSTYL)                                                  
  3672. C THIS SUBROUTINE INITIALIZES GRAPHICS SIZE PARAMETERS                          
  3673. C IPARM = (1,2) = PARAMETERS FOR (LINE,CONTOUR) PLOTS                           
  3674.       COMMON /GRDEV/ LX, LY, NBIT, IFRMT, INTRL, IXOR                           
  3675.       IF (IPARM.LE.0) GO TO 40                                                  
  3676.       IRX = LX                                                                  
  3677.       IRY = LY                                                                  
  3678.       XS = FLOAT(LX)/1024.                                                      
  3679.       YS = FLOAT(LY)/780.                                                       
  3680.       ICH = 26.*YS + .5                                                         
  3681.       ICW = 18.*XS + .5                                                         
  3682.       IGSTYL = 1                                                                
  3683.       IF (IPARM.GT.1) GO TO 20                                                  
  3684. C PARAMETERS FOR LINE PLOTS                                                     
  3685.       MNX = 225.*XS + .5                                                        
  3686.       MNY = 115.*YS + .5                                                        
  3687.       LNX = 785.*XS + .5                                                        
  3688.       LNY = 650.*YS + .5                                                        
  3689.       ISLB = 225.*XS + .5                                                       
  3690.       ISTCX = 10.*XS + .5                                                       
  3691.       ISTCY = 10.*YS + .5                                                       
  3692.       NTCX = 10                                                                 
  3693.       NTCY = 10                                                                 
  3694.       GO TO 40                                                                  
  3695.    20 IF (IPARM.GT.2) GO TO 30                                                  
  3696. C PARAMETERS FOR CONTOUR PLOTS                                                  
  3697.       MNX = 225.*XS + .5                                                        
  3698.       MNY = 80.*YS + .5                                                         
  3699.       LNX = 690.*XS + .5                                                        
  3700.       LNY = 690.*YS + .5                                                        
  3701.       ISLB = 225.*XS + .5                                                       
  3702.       ISTCX = 0                                                                 
  3703.       ISTCY = 0                                                                 
  3704.       NTCX = 1                                                                  
  3705.       NTCY = 1                                                                  
  3706.       GO TO 40                                                                  
  3707.    30 IF (IPARM.GT.3) GO TO 40                                                  
  3708. C PARAMETERS FOR TEXT PLOTS                                                     
  3709.       MNX = 0                                                                   
  3710.       MNY = 0                                                                   
  3711.       LNX = LX - 1                                                              
  3712.       LNY = LY - 1                                                              
  3713.       ISLB = 0                                                                  
  3714.       ISTCX = 0                                                                 
  3715.       ISTCY = 0                                                                 
  3716.       NTCX = 1                                                                  
  3717.       NTCY = 1                                                                  
  3718. *     **************************************************                        
  3719. *     WHAT ABOUT PARAMETERS FOR RASTER IMAGES???                                
  3720. *     WHAT SHOULD THESE BE??????                                                
  3721. *     **************************************************                        
  3722.    40 RETURN                                                                    
  3723.       END                                                                       
  3724. *                                                                               
  3725. *****************************************************                           
  3726. * DRAWG -- GENERIC DRAW ROUTINE                                                 
  3727. *****************************************************                           
  3728. *                                                                               
  3729. *                                                                               
  3730. *****************************************************                           
  3731. * drawg -- generic draw routine                                                 
  3732. *****************************************************                           
  3733. *                                                                               
  3734.       SUBROUTINE DRAWG(C,X,Y,IC,LWTYPE,L,ICODE)                                 
  3735. C THIS SUBROUTINES IS A GENERIC DRAW ROUTINE                                    
  3736. C IF ICODE = 0 ZEROES IMAGE                                                     
  3737. C IF ICODE = 1 PERFORMS MOVE                                                    
  3738. C IF ICODE = 2 DRAWS LINE                                                       
  3739. C IF ICODE = 3 DRAWS POINT                                                      
  3740. C IF ICODE = 4 DRAWS DASHED LINE                                                
  3741. C IF ICODE = 5 WRITES CHARACTERS                                                
  3742. C IF ICODE = 6 DRAWS IMAGE                                                      
  3743. C LX = NUMBER OF PIXELS IN X, LY = NUMBER OF PIXELS IN Y                        
  3744. C NBIT = NUMBER OF BITS PER PIXEL, NBIT < 9                                     
  3745.       PARAMETER(LXM=1024,LYM=781,NBITD=8)                                       
  3746.       PARAMETER(NPIXD=8/NBITD,LZM=(LXM-1)/NPIXD+1,LENBM=LZM*LYM)                
  3747.       PARAMETER(LENGM=LENBM+LZM,LZGM=LZM+1)                                     
  3748.       COMMON /GRDEV/ LX, LY, NBIT, IFRMT, INTRL, IXOR                           
  3749.       COMMON /RCOM/ MINX,LENX,MINY,LENY,ICX,ICY,                                
  3750.      1XMIN,XMAX,YMIN,YMAX,DX,DY,CSX,CSY                                         
  3751.       CHARACTER*1 C                                                             
  3752.       CHARACTER*1 BLANK                                                         
  3753.       CHARACTER*1 G(LXM*LYM)                                                    
  3754.       CHARACTER*1 IMAGE(LENBM), JMAGE(LENBM)                                    
  3755.       CHARACTER*1 IMG(LENGM), LINE(LZM), LIMG(LZGM)                             
  3756.       CHARACTER*1 CTYPE                                                         
  3757.       DIMENSION ICOLOR(16), ITWOBC(16)                                          
  3758.       DIMENSION IETA(256)                                                       
  3759.       SAVE ISTART,ICC,G,CTYPE,BLANK,ICOLOR,ITWOBC,IETA                          
  3760.       SAVE LZ,LENB,LENG,LZG,JMAGE                                               
  3761.    91 FORMAT (24H SIZE ERROR, LXM, LYM = ,2I12,10H LX, LY = ,2I12)              
  3762.       DATA ISTART,ICC /0,-1/                                                    
  3763. C COLOR TABLE FOR 4 BIT COLOR                                                   
  3764.       DATA ICOLOR /0,1,2,3,4,5,6,7,1,1,2,3,4,5,6,7/                             
  3765. C COLOR TABLE FOR 2 BIT COLOR                                                   
  3766.       DATA ITWOBC /0,1,1,1,2,2,3,3,1,1,1,1,2,2,3,3/                             
  3767. C EBCDIC/ASCII TRANSLATION WITH CONVENTIONS AT CORNELL CNSF IBM 3090VF.         
  3768. C ASCII CODES FOR EBCDIC 74,79,113,139,155 ARE NON-STANDARD                     
  3769. C EBCDIC CODES 28,30,106 ARE ADDED FOR IBM COMPATIBILITY                        
  3770.       DATA IETA /0,1,2,3,-1,9,-1,127,-1,-1,-1,11,12,13,14,15,16,17,18,19        
  3771.      1,-1,-1,8,-1,24,25,-1,-1,28,29,30,31,-1,-1,28,-1,-1,10,23,27,-1,-1,        
  3772.      2-1,-1,-1,5,6,7,-1,-1,22,-1,-1,30,-1,4,-1,-1,-1,-1,20,21,-1,26,32,-        
  3773.      31,-1,-1,-1,-1,-1,-1,-1,-1,92,46,60,40,43,124,38,-1,-1,-1,-1,-1,-1,        
  3774.      4-1,-1,-1,33,36,42,41,59,94,45,47,-1,-1,-1,-1,-1,-1,-1,-1,124,44,37        
  3775.      5,95,62,63,-1,94,-1,-1,-1,-1,-1,-1,-1,96,58,35,64,39,61,34,-1,97,98        
  3776.      6,99,100,101,102,103,104,105,-1,123,-1,-1,-1,-1,-1,106,107,108,109,        
  3777.      7110,111,112,113,114,-1,125,-1,-1,-1,-1,-1,126,115,116,117,118,119,        
  3778.      8120,121,122,-1,-1,-1,91,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,        
  3779.      9-1,93,-1,-1,123,65,66,67,68,69,70,71,72,73,-1,-1,-1,-1,-1,-1,125,7        
  3780.      A4,75,76,77,78,79,80,81,82,-1,-1,-1,-1,-1,-1,92,-1,83,84,85,86,87,8        
  3781.      B8,89,90,-1,-1,-1,-1,-1,-1,48,49,50,51,52,53,54,55,56,57,-1,-1,-1,-        
  3782.      C1,-1,-1/                                                                  
  3783.       DATA CTYPE /' '/                                                          
  3784.       IF (ISTART.NE.0) GO TO 30                                                 
  3785. C INITIALIZE VARIABLES                                                          
  3786.       IF ((LX.LE.LXM).AND.(LY.LE.LYM)) GO TO 10                                 
  3787.       WRITE (6,91) LXM, LYM, LX, LY                                             
  3788.       STOP 1                                                                    
  3789.    10 NPIX = 8/NBIT                                                             
  3790.       LZ = (LX - 1)/NPIX + 1                                                    
  3791.       LENB = LZ*LY                                                              
  3792.       LENG = LENB + LZ                                                          
  3793.       LZG = LZ + 1                                                              
  3794.       BLANK = CHAR(0)                                                           
  3795.       DO 20 J = 1, LENB                                                         
  3796.       JMAGE(J) = BLANK                                                          
  3797.    20 CONTINUE                                                                  
  3798.       ISTART = 1                                                                
  3799. C CHECK CODE                                                                    
  3800.    30 IF ((ICODE.LT.0).OR.(ICODE.GT.6)) GO TO  80                               
  3801.       IF (ICODE.GT.0) GO TO 40                                                  
  3802. C CLEAR IMAGE                                                                   
  3803.       CALL ZIMAGE(G,BLANK,LX,LY)                                                
  3804.       GO TO  80                                                                 
  3805.    40 IF (ICODE.GT.5) GO TO 70                                                  
  3806. C PERFORM DRAW INSTRUCTION                                                      
  3807.       IF (IC.EQ.ICC) GO TO 50                                                   
  3808.       ICC = IC                                                                  
  3809.       ICT = IC - (IC/16)*16                                                     
  3810.       IF ((NBIT.EQ.1).AND.(ICT.GT.0)) ICT = 1                                   
  3811.       IF (NBIT.EQ.2) ICT = ITWOBC(ICT+1)                                        
  3812.       IF (NBIT.GE.4) ICT = ICOLOR(ICT+1)                                        
  3813.       CTYPE = CHAR(ICT)                                                         
  3814. C FIRST PERFORM SCALING TO RASTER UNITS AND CLIP IF NECESSARY                   
  3815.    50 I = (X - XMIN)*DX + .5                                                    
  3816.       J = (Y - YMIN)*DY + .5                                                    
  3817.       IF (I.LT.0) I = 0                                                         
  3818.       IF (I.GT.LENX) I = LENX                                                   
  3819.       IF (J.LT.0) J = 0                                                         
  3820.       IF (J.GT.LENY) J = LENY                                                   
  3821.       I = I + MINX                                                              
  3822.       J = J + MINY                                                              
  3823. C PERFORM DRAW                                                                  
  3824.       IF (ICODE.EQ.5) GO TO 60                                                  
  3825.       IF (ICODE.EQ.1) CALL DMOVE(I,J,ICX,ICY)                                   
  3826.       IF (ICODE.EQ.2) CALL DLINE(G,CTYPE,BLANK,LX,LY,I,J,ICX,ICY,LWTYPE)        
  3827.       IF (ICODE.EQ.3) CALL DPNT(G,CTYPE,BLANK,LX,LY,I,J,ICX,ICY,LWTYPE)         
  3828.       IF (ICODE.EQ.4) CALL DASHLN(G,CTYPE,BLANK,LX,LY,I,J,ICX,ICY,L,LWTY        
  3829.      1PE)                                                                       
  3830.       GO TO  80                                                                 
  3831.    60 ICT = IETA(ICHAR(C)+1)                                                    
  3832.       CALL CDRAW(G,CTYPE,BLANK,LX,LY,ICT,I,J,ICX,ICY,CSX,CSY,LWTYPE)            
  3833.       GO TO  80                                                                 
  3834.    70 CALL GIMAGE (G,IMAGE,LX,LY,LZ,NBIT,INTRL)                                 
  3835.       CALL PCTSAV(IMAGE,JMAGE,IMG,LINE,LIMG,IXOR,LZ,LY,LENB,LENG,LZG,IFR        
  3836.      1MT,INTRL)                                                                 
  3837.    80 RETURN                                                                    
  3838.       END                                                                       
  3839. *                                                                               
  3840. *****************************************************                           
  3841. * COMPRG -- COMPRESSES RASTER IMAGE AND WRITES TO DISK                          
  3842. *****************************************************                           
  3843. *                                                                               
  3844.       SUBROUTINE COMPRG( G, NX, NY, NXV, inputbits, filter, irev )              
  3845.                                                                                 
  3846. C THIS SUBROUTINE COMPRESSES RASTER IMAGE AND WRITES RESULT TO DISK             
  3847. C INPUT IS IN ARRAY G, AND OUTPUT IS WRITTEN TO DISK                            
  3848. C IF LX < NX OR LY < NY, THEN IMAGE IS TRUNCATED                                
  3849. C IF LX > NX OR LY > NY, THEN IMAGE IS PADDED WITH NULLS                        
  3850. C LX = NUMBER OF PIXELS IN X, LY = NUMBER OF PIXELS IN Y                        
  3851. C NBIT = NUMBER OF BITS PER PIXEL, NBIT < 9                                     
  3852.                                                                                 
  3853.       PARAMETER(LXM=1024,LYM=781,NBITD=8)                                       
  3854.       PARAMETER(NPIXD=8/NBITD,LZM=(LXM-1)/NPIXD+1,LENBM=LZM*LYM)                
  3855.       PARAMETER(LENGM=LENBM+LZM,LZGM=LZM+1)                                     
  3856.       COMMON /GRDEV/ LX, LY, NBIT, IFRMT, INTRL, IXOR                           
  3857.       CHARACTER*1 G(NXV,NY)                                                     
  3858.       integer     inputbits                                                     
  3859.       integer     filter                                                        
  3860.       CHARACTER*1 BLANK                                                         
  3861.       CHARACTER*1 IMAGE(LENBM), JMAGE(LENBM)                                    
  3862.       CHARACTER*1 IMG(LENGM), LINE(LZM), LIMG(LZGM)                             
  3863.       SAVE ISTART,BLANK                                                         
  3864.       SAVE LZ,LENB,LENG,LZG,JMAGE                                               
  3865.    91 FORMAT (24H SIZE ERROR, LXM, LYM = ,2I12,10H LX, LY = ,2I12)              
  3866.       DATA ISTART /0/                                                           
  3867.                                                                                 
  3868.       IF (ISTART.NE.0) GO TO 30                                                 
  3869.                                                                                 
  3870. C INITIALIZE VARIABLES                                                          
  3871.       IF ((LX.LE.LXM).AND.(LY.LE.LYM)) GO TO 10                                 
  3872.       WRITE (6,91) LXM, LYM, LX, LY                                             
  3873.       STOP 1                                                                    
  3874.    10 NPIX = 8/NBIT                                                             
  3875.       LZ = (LX - 1)/NPIX + 1                                                    
  3876.       LENB = LZ*LY                                                              
  3877.       LENG = LENB + LZ                                                          
  3878.       LZG = LZ + 1                                                              
  3879.       BLANK = CHAR(0)                                                           
  3880.          DO 20 J = 1, LENB                                                      
  3881.             JMAGE(J) = BLANK                                                    
  3882.    20    CONTINUE                                                               
  3883.       ISTART = 1                                                                
  3884.                                                                                 
  3885. *     *****************************************************                     
  3886. *     apply filter if needed                                                    
  3887. *        there are 4 filters available:                                         
  3888. *           filter = 0  -- do not filter                                        
  3889. *           filter = 1  -- all non-background colors to white                   
  3890. *           filter = 2  -- threshold                                            
  3891. *           filter = 3  -- dither                                               
  3892. *        there are 3 output formats available:                                  
  3893. *           nbit = 1    -- monocrome                                            
  3894. *           nbit = 2    -- 4 color                                              
  3895. *           nbit = 8    -- 256 color                                            
  3896. *     *****************************************************                     
  3897.                                                                                 
  3898.    30 continue                                                                  
  3899.                                                                                 
  3900. *     *****************************************************                     
  3901. *     if filtering not requested do nothing                                     
  3902. *     *****************************************************                     
  3903.                                                                                 
  3904.       if( filter .eq. 0 ) then                                                  
  3905.                                                                                 
  3906. *     *****************************************************                     
  3907. *     if the number of bits in the output image is greate                       
  3908. *     than or equal to those in the input image, do nothing                     
  3909. *     *****************************************************                     
  3910.                                                                                 
  3911.       else if( nbit .ge. inputbits ) then                                       
  3912.                                                                                 
  3913. *     *****************************************************                     
  3914. *     filtering is all non-background colors to white                           
  3915. *     *****************************************************                     
  3916.                                                                                 
  3917.       else if( filter .eq. 1 ) then                                             
  3918.          call towhite( g, nx, ny, inputbits )                                   
  3919.                                                                                 
  3920. *     *****************************************************                     
  3921. *     filtering is by threshold                                                 
  3922. *     *****************************************************                     
  3923.                                                                                 
  3924.       else if( filter .eq. 2 ) then                                             
  3925.          if( nbit .eq. 1 ) then                                                 
  3926.             call thrhld1( g, nx, ny, inputbits )                                
  3927.          else if( nbit .eq. 2 ) then                                            
  3928.             call thrhld2( g, nx, ny )                                           
  3929.          else                                                                   
  3930.          end if                                                                 
  3931.                                                                                 
  3932. *     *****************************************************                     
  3933. *     filtering is by dither                                                    
  3934. *     *****************************************************                     
  3935.                                                                                 
  3936.       else                                                                      
  3937.          if( nbit .eq. 1 ) then                                                 
  3938.             if( inputbits .eq. 2 ) then                                         
  3939.                call dithr12( g, nx, ny )                                        
  3940.             else                                                                
  3941.                call dithr18( g, nx, ny )                                        
  3942.             end if                                                              
  3943.          else if( nbit .eq. 2 ) then                                            
  3944.             call dithr28( g, nx, ny )                                           
  3945.          else                                                                   
  3946.          end if                                                                 
  3947.       end if                                                                    
  3948.                                                                                 
  3949. *     *****************************************************                     
  3950. *     now compress and write out the image                                      
  3951. *     *****************************************************                     
  3952.                                                                                 
  3953.       CALL GRIMAGE (G,IMAGE,NX,NY,NXV,LX,LY,LZ,NBIT,INTRL,irev)                 
  3954.       CALL PCTSAV(IMAGE,JMAGE,IMG,LINE,LIMG,IXOR,LZ,LY,LENB,LENG,LZG,IFR        
  3955.      1MT,INTRL)                                                                 
  3956.       RETURN                                                                    
  3957.       END                                                                       
  3958. *                                                                               
  3959. *****************************************************                           
  3960. * towhite -- turns all non-background colors to white                           
  3961. *****************************************************                           
  3962. *                                                                               
  3963.       subroutine towhite( g, nx, ny, inputbits )                                
  3964.                                                                                 
  3965.       COMMON /GRDEV/ LX, LY, NBIT, IFRMT, INTRL, IXOR                           
  3966.                                                                                 
  3967.       character*1 g(nx,ny)                                                      
  3968.                                                                                 
  3969.                                                                                 
  3970. *        ********************************                                       
  3971. *        convert each byte in the g array                                       
  3972. *        ********************************                                       
  3973.                                                                                 
  3974.          do 1 ix = 1,nx                                                         
  3975.             do 2 iy = 1,ny                                                      
  3976.                                                                                 
  3977. *              *****************************************                        
  3978. *              since we are only reducing the # of bits,                        
  3979. *              then if the inputbits = 2, the output                            
  3980. *              bits must = 1.                                                   
  3981. *              if inputbits = 2, there are 4 input colors                       
  3982. *              with 0 = background                                              
  3983. *              for bits = 1, 0 is background, 1 = the color                     
  3984. *              ******************************************                       
  3985.                                                                                 
  3986.                if( inputbits .eq. 2 ) then                                      
  3987.                   is = ichar( g( ix,iy ) )                                      
  3988.                   g( ix,iy ) = char( is - (is/4)*4 )                            
  3989.                   if( g( ix,iy ) .ne. char( 0 ) )                               
  3990.      .               g( ix,iy ) = char( 1 )                                     
  3991.                                                                                 
  3992. *              **************************************************               
  3993. *              if inputbits = 8, there are 256 input colors                     
  3994. *              with 0 = background, all others are color                        
  3995. *              if nbit is 1, the non-background color is 1                      
  3996. *              if nbit is 2, the non-background color is 3                      
  3997. *              **************************************************               
  3998.                                                                                 
  3999.                else                                                             
  4000.                   if( nbit .eq. 1 ) then                                        
  4001.                      if( g( ix,iy ) .ne. char( 0 ) )                            
  4002.      .                  g( ix,iy ) = char( 1 )                                  
  4003.                   else                                                          
  4004.                      if( g( ix,iy ) .ne. char( 0 ) )                            
  4005.      .                  g( ix,iy ) = char( 3 )                                  
  4006.                   end if                                                        
  4007.                                                                                 
  4008.                end if                                                           
  4009.                                                                                 
  4010. 2           continue                                                            
  4011. 1        continue                                                               
  4012.       return                                                                    
  4013.       end                                                                       
  4014. *                                                                               
  4015. *****************************************************                           
  4016. * thrhld1 -- threshold to 1 bit output                                          
  4017. *****************************************************                           
  4018. *                                                                               
  4019.       subroutine thrhld1( g, nx, ny, inputbits )                                
  4020.                                                                                 
  4021.       character*1 g(nx,ny)                                                      
  4022.                                                                                 
  4023.                                                                                 
  4024. *     **************************************************                        
  4025. *     find the max and min values in g for 8 bit images                         
  4026. *     **************************************************                        
  4027.                                                                                 
  4028.       if( inputbits .eq. 8 ) then                                               
  4029.          min = 255                                                              
  4030.          max = 0                                                                
  4031.                                                                                 
  4032.             do 3 ix = 1,nx                                                      
  4033.                do 4 iy = 1,ny                                                   
  4034.                   ival = ichar( g(ix,iy) )                                      
  4035.                   if( ival .lt. min )                                           
  4036.      .               min = ival                                                 
  4037.                   if( ival .gt. max )                                           
  4038.      .               max = ival                                                 
  4039. 4              continue                                                         
  4040. 3           continue                                                            
  4041.                                                                                 
  4042.          idist = max - min + 1                                                  
  4043.          ihalf = idist / 2                                                      
  4044.          midpt = min + ihalf - 1                                                
  4045.                                                                                 
  4046.       end if                                                                    
  4047.                                                                                 
  4048. *        ********************************                                       
  4049. *        convert each byte in the g array                                       
  4050. *        ********************************                                       
  4051.                                                                                 
  4052.          do 1 ix = 1,nx                                                         
  4053.             do 2 iy = 1,ny                                                      
  4054.                                                                                 
  4055. *              *****************************************                        
  4056. *              if inputbits = 2, convert 0 and 1 to 0                           
  4057. *              and 2 and 3 to 1                                                 
  4058. *              ******************************************                       
  4059.                                                                                 
  4060.                if( inputbits .eq. 2 ) then                                      
  4061.                                                                                 
  4062. *                 **************************************                        
  4063. *                 only except stuff in the low order 2                          
  4064. *                 bits of g                                                     
  4065. *                 ***************************************                       
  4066.                                                                                 
  4067.                   is = ichar( g( ix,iy ) )                                      
  4068.                   g( ix,iy ) = char( is - (is/4)*4 )                            
  4069.                                                                                 
  4070. *                 **************************************                        
  4071. *                 now compare with the threshold                                
  4072. *                 ***************************************                       
  4073.                                                                                 
  4074.                   if( g( ix,iy ) .le. char( 1 ) ) then                          
  4075.                      g( ix,iy ) = char( 0 )                                     
  4076.                   else                                                          
  4077.                      g( ix,iy ) = char( 1 )                                     
  4078.                   end if                                                        
  4079.                                                                                 
  4080. *              **************************************************               
  4081. *              if inputbits = 8, there are 256 input colors                     
  4082. *              convert 0 - midpt to 0 and midpt - 255 to 1                      
  4083. *              **************************************************               
  4084.                                                                                 
  4085.                else                                                             
  4086.                   if( ichar( g(ix,iy) ) .le. midpt ) then                       
  4087.                      g( ix,iy ) = char( 0 )                                     
  4088.                   else                                                          
  4089.                      g( ix,iy ) = char( 1 )                                     
  4090.                   end if                                                        
  4091.                                                                                 
  4092.                end if                                                           
  4093.                                                                                 
  4094. 2           continue                                                            
  4095. 1        continue                                                               
  4096.       return                                                                    
  4097.       end                                                                       
  4098. *                                                                               
  4099. *****************************************************                           
  4100. * thrhld2 -- threshold to 2 bit output                                          
  4101. *            2 bit output has the following colors:                             
  4102. *               0 = background                                                  
  4103. *               1 = magenta                                                     
  4104. *               2 = cyan                                                        
  4105. *               3 = white                                                       
  4106. *****************************************************                           
  4107. *                                                                               
  4108.       subroutine thrhld2( g, nx, ny )                                           
  4109.                                                                                 
  4110.       character*1 g(nx,ny)                                                      
  4111.       integer     midpt( 3 )                                                    
  4112.                                                                                 
  4113.                                                                                 
  4114. *     ***********************************************                           
  4115. *     we can only be dealing with 8 bit input that                              
  4116. *     we are taking down to 2 bit output                                        
  4117. *     ***********************************************                           
  4118.                                                                                 
  4119. *     **************************************************                        
  4120. *     find the max and min values in g                                          
  4121. *     **************************************************                        
  4122.                                                                                 
  4123.       min = 255                                                                 
  4124.       max = 0                                                                   
  4125.                                                                                 
  4126.          do 3 ix = 1,nx                                                         
  4127.             do 4 iy = 1,ny                                                      
  4128.                ival = ichar( g(ix,iy) )                                         
  4129.                if( ival .lt. min )                                              
  4130.      .            min = ival                                                    
  4131.                if( ival .gt. max )                                              
  4132.      .            max = ival                                                    
  4133. 4           continue                                                            
  4134. 3        continue                                                               
  4135.                                                                                 
  4136.       idist = max - min + 1                                                     
  4137.       ihalf = idist / 2                                                         
  4138.       midpt( 2 ) = min + ihalf - 1                                              
  4139.       ihalf = idist / 4                                                         
  4140.       midpt( 1 ) = min + ihalf - 1                                              
  4141.       midpt( 3 ) = midpt( 2 ) + ihalf - 1                                       
  4142.                                                                                 
  4143. *        ********************************                                       
  4144. *        convert each byte in the g array                                       
  4145. *        ********************************                                       
  4146.                                                                                 
  4147.          do 1 ix = 1,nx                                                         
  4148.             do 2 iy = 1,ny                                                      
  4149.                                                                                 
  4150. *              **************************************************               
  4151. *              if inputbits = 8, there are 256 input colors                     
  4152. *              convert 0 - 63 to 0, 64 - 127 to 1                               
  4153. *                      128 - 191 to 2, 192 - 255 to 3                           
  4154. *              **************************************************               
  4155.                                                                                 
  4156.                if( ichar( g(ix,iy) ) .le. midpt( 1 ) ) then                     
  4157.                   g( ix,iy ) = char( 0 )                                        
  4158.                else if( ichar( g(ix,iy) ) .le. midpt( 2 ) ) then                
  4159.                   g( ix,iy ) = char( 1 )                                        
  4160.                else if( ichar( g(ix,iy) ) .le. midpt( 3 ) ) then                
  4161.                   g( ix,iy ) = char( 2 )                                        
  4162.                else                                                             
  4163.                   g( ix,iy ) = char( 3 )                                        
  4164.                end if                                                           
  4165.                                                                                 
  4166. 2           continue                                                            
  4167. 1        continue                                                               
  4168.       return                                                                    
  4169.       end                                                                       
  4170. *                                                                               
  4171. *****************************************************                           
  4172. * dithr12 -- dither a 2 bit input to a 1 bit output                             
  4173. *****************************************************                           
  4174. *                                                                               
  4175.       subroutine dithr12( g, nx, ny )                                           
  4176.                                                                                 
  4177.       character*1 g( nx,ny )                                                    
  4178.       integer     d( 2,2 )                                                      
  4179.       data d  / 0, 2,                                                           
  4180.      .          3, 1  /                                                         
  4181.                                                                                 
  4182.                                                                                 
  4183. *        ********************************                                       
  4184. *        convert each byte in the g array                                       
  4185. *        ********************************                                       
  4186.                                                                                 
  4187.          do 1 ix = 1,nx                                                         
  4188.             ixd = mod( ix, 2 ) + 1                                              
  4189.                                                                                 
  4190.                do 2 iy = 1,ny                                                   
  4191.                   iyd = mod( iy, 2 ) + 1                                        
  4192.                                                                                 
  4193. *                 **************************************                        
  4194. *                 only except stuff in the low order 2                          
  4195. *                 bits of g                                                     
  4196. *                 ***************************************                       
  4197.                                                                                 
  4198.                   is = ichar( g( ix,iy ) )                                      
  4199.                   g( ix,iy ) = char( is - (is/4)*4 )                            
  4200.                                                                                 
  4201. *                 **************************************                        
  4202. *                 now compare with the dither threshold                         
  4203. *                 ***************************************                       
  4204.                                                                                 
  4205.                   if( g( ix, iy ) .le. char( d( ixd,iyd ) ) ) then              
  4206.                      g( ix, iy ) = char( 0 )                                    
  4207.                   else                                                          
  4208.                      g( ix, iy ) = char( 1 )                                    
  4209.                   end if                                                        
  4210.                                                                                 
  4211. 2              continue                                                         
  4212. 1        continue                                                               
  4213.       return                                                                    
  4214.       end                                                                       
  4215. *                                                                               
  4216. *****************************************************                           
  4217. * dithr18 -- dither an 8 bit input to a 1 bit output                            
  4218. *****************************************************                           
  4219. *                                                                               
  4220.       subroutine dithr18( g, nx, ny )                                           
  4221.                                                                                 
  4222.       character*1 g( nx,ny )                                                    
  4223.       integer     d( 8,8 )                                                      
  4224.       data d  /  0, 32,  8, 40,  2, 34, 10, 42,                                 
  4225.      .          48, 16, 56, 24, 50, 18, 58, 26,                                 
  4226.      .          12, 44,  4, 36, 14, 46,  6, 38,                                 
  4227.      .          60, 28, 52, 20, 62, 30, 54, 22,                                 
  4228.      .           3, 35, 11, 43,  1, 33,  9, 41,                                 
  4229.      .          51, 19, 59, 27, 49, 17, 57, 25,                                 
  4230.      .          15, 47,  7, 39, 13, 45,  5, 37,                                 
  4231.      .          63, 31, 55, 23, 61, 29, 53, 21   /                              
  4232.                                                                                 
  4233.                                                                                 
  4234. *     **************************************************                        
  4235. *     find the max and min values in g                                          
  4236. *     **************************************************                        
  4237.                                                                                 
  4238.       min = 255                                                                 
  4239.       max = 0                                                                   
  4240.                                                                                 
  4241.          do 3 ix = 1,nx                                                         
  4242.             do 4 iy = 1,ny                                                      
  4243.                ival = ichar( g(ix,iy) )                                         
  4244.                if( ival .lt. min )                                              
  4245.      .            min = ival                                                    
  4246.                if( ival .gt. max )                                              
  4247.      .            max = ival                                                    
  4248. 4           continue                                                            
  4249. 3        continue                                                               
  4250.                                                                                 
  4251.       if( min .lt. 64 ) then                                                    
  4252.          min = 0                                                                
  4253.       else if( min .lt. 128 ) then                                              
  4254.          min = 64                                                               
  4255.       else if( min .lt. 192 ) then                                              
  4256.          min = 128                                                              
  4257.       else                                                                      
  4258.          min = 192                                                              
  4259.       end if                                                                    
  4260.                                                                                 
  4261.       if( max .lt. 63 ) then                                                    
  4262.          max = 63                                                               
  4263.       else if( max .lt. 127 ) then                                              
  4264.          max = 127                                                              
  4265.       else if( max .lt. 191 ) then                                              
  4266.          max = 191                                                              
  4267.       else                                                                      
  4268.          max = 255                                                              
  4269.       end if                                                                    
  4270.                                                                                 
  4271.       if( max - min .eq. 63 ) then                                              
  4272.          mfactor = 1                                                            
  4273.       else if( max - min .eq. 127 ) then                                        
  4274.          mfactor = 2                                                            
  4275.       else if( max - min .eq. 191 ) then                                        
  4276.          mfactor = 3                                                            
  4277.       else                                                                      
  4278.          mfactor = 4                                                            
  4279.       end if                                                                    
  4280.                                                                                 
  4281. *        ********************************                                       
  4282. *        convert each byte in the g array                                       
  4283. *        ********************************                                       
  4284.                                                                                 
  4285.          do 1 ix = 1,nx                                                         
  4286.             ixd = mod( ix, 8 ) + 1                                              
  4287.                                                                                 
  4288.                do 2 iy = 1,ny                                                   
  4289.                   iyd = mod( iy, 8 ) + 1                                        
  4290.                                                                                 
  4291.                   if(  ichar( g(ix,iy) )                                        
  4292.      .                 .le.                                                     
  4293.      .                 ( d(ixd,iyd) * mfactor ) + min  ) then                   
  4294.                      g( ix, iy ) = char( 0 )                                    
  4295.                   else                                                          
  4296.                      g( ix, iy ) = char( 1 )                                    
  4297.                   end if                                                        
  4298.                                                                                 
  4299. 2              continue                                                         
  4300. 1        continue                                                               
  4301.       return                                                                    
  4302.       end                                                                       
  4303. *                                                                               
  4304. *****************************************************                           
  4305. * dithr28 -- dither an 8 bit input to a 2 bit output                            
  4306. *****************************************************                           
  4307. *                                                                               
  4308.       subroutine dithr28( g, nx, ny )                                           
  4309.                                                                                 
  4310.       common /dithpal/ pal64, npal64                                            
  4311.       character*1 pal64( 3,256 )                                                
  4312.                                                                                 
  4313.       character*1 g( nx,ny )                                                    
  4314.                                                                                 
  4315.       character*1 red( 1000,1000 )                                              
  4316.       character*1 green( 1000,1000 )                                            
  4317.       character*1 blue( 1000,1000 )                                             
  4318.                                                                                 
  4319.       integer     d( 8,8 )                                                      
  4320.       data d  /  0, 32,  8, 40,  2, 34, 10, 42,                                 
  4321.      .          48, 16, 56, 24, 50, 18, 58, 26,                                 
  4322.      .          12, 44,  4, 36, 14, 46,  6, 38,                                 
  4323.      .          60, 28, 52, 20, 62, 30, 54, 22,                                 
  4324.      .           3, 35, 11, 43,  1, 33,  9, 41,                                 
  4325.      .          51, 19, 59, 27, 49, 17, 57, 25,                                 
  4326.      .          15, 47,  7, 39, 13, 45,  5, 37,                                 
  4327.      .          63, 31, 55, 23, 61, 29, 53, 21   /                              
  4328.                                                                                 
  4329.                                                                                 
  4330. *     ********************************************************                  
  4331. *     if there is no palette present, use the default palette                   
  4332. *     ********************************************************                  
  4333.                                                                                 
  4334.                                                                                 
  4335.       if( npal64 .eq. 0 ) then                                                  
  4336.          pal64( 1, 1 ) = char(  0 )                                             
  4337.          pal64( 2, 1 ) = char(  0 )                                             
  4338.          pal64( 3, 1 ) = char(  0 )                                             
  4339.                                                                                 
  4340.          pal64( 1, 2 ) = char(  0 )                                             
  4341.          pal64( 2, 2 ) = char(  0 )                                             
  4342.          pal64( 3, 2 ) = char( 63 )                                             
  4343.                                                                                 
  4344.          pal64( 1, 3 ) = char(  0 )                                             
  4345.          pal64( 2, 3 ) = char( 63 )                                             
  4346.          pal64( 3, 3 ) = char(  0 )                                             
  4347.                                                                                 
  4348.          pal64( 1, 4 ) = char(  0 )                                             
  4349.          pal64( 2, 4 ) = char( 63 )                                             
  4350.          pal64( 3, 4 ) = char( 63 )                                             
  4351.                                                                                 
  4352.          pal64( 1, 5 ) = char( 63 )                                             
  4353.          pal64( 2, 5 ) = char(  0 )                                             
  4354.          pal64( 3, 5 ) = char(  0 )                                             
  4355.                                                                                 
  4356.          pal64( 1, 6 ) = char( 63 )                                             
  4357.          pal64( 2, 6 ) = char(  0 )                                             
  4358.          pal64( 3, 6 ) = char( 63 )                                             
  4359.                                                                                 
  4360.          pal64( 1, 7 ) = char( 63 )                                             
  4361.          pal64( 2, 7 ) = char( 63 )                                             
  4362.          pal64( 3, 7 ) = char(  0 )                                             
  4363.                                                                                 
  4364.          pal64( 1, 8 ) = char( 63 )                                             
  4365.          pal64( 2, 8 ) = char( 63 )                                             
  4366.          pal64( 3, 8 ) = char( 63 )                                             
  4367.                                                                                 
  4368.          npal64 = 8                                                             
  4369.                                                                                 
  4370.       end if                                                                    
  4371.                                                                                 
  4372. *     **************************************                                    
  4373. *     do this if the palet has > 4 entries                                      
  4374. *     **************************************                                    
  4375.                                                                                 
  4376.                                                                                 
  4377.       if( npal64 .gt. 4 ) then                                                  
  4378.                                                                                 
  4379. *        ***********************************************                        
  4380. *        look up each pixel in the image on the palette                         
  4381. *        and create a separate red, green, and blue image                       
  4382. *        ***********************************************                        
  4383.                                                                                 
  4384.          do 1 ix = 1,nx                                                         
  4385.             do 2 iy = 1,ny                                                      
  4386.                                                                                 
  4387.                ipalno = ichar( g( ix,iy ) ) + 1                                 
  4388.                if( ipalno .gt. npal64 ) then                                    
  4389.                   red(   ix,iy ) = char( 0 )                                    
  4390.                   green( ix,iy ) = char( 0 )                                    
  4391.                   blue(  ix,iy ) = char( 0 )                                    
  4392.                else                                                             
  4393.                   red(   ix,iy ) = pal64( 1, ipalno )                           
  4394.                   green( ix,iy ) = pal64( 2, ipalno )                           
  4395.                   blue(  ix,iy ) = pal64( 3, ipalno )                           
  4396.                end if                                                           
  4397. 2           continue                                                            
  4398. 1        continue                                                               
  4399.                                                                                 
  4400. *        ***********************************************                        
  4401. *        dither the reds                                                        
  4402. *        ***********************************************                        
  4403.                                                                                 
  4404.          do 11 ix = 1,nx                                                        
  4405.             ixd = mod( ix, 8 ) + 1                                              
  4406.                                                                                 
  4407.                do 12 iy = 1,ny                                                  
  4408.                   iyd = mod( iy, 8 ) + 1                                        
  4409.                                                                                 
  4410.                   if( red( ix, iy ) .le. char( d( ixd, iyd ) ) ) then           
  4411.                      red( ix, iy ) = char( 0 )                                  
  4412.                   else                                                          
  4413.                      red( ix, iy ) = char( 1 )                                  
  4414.                   end if                                                        
  4415.                                                                                 
  4416. 12             continue                                                         
  4417. 11       continue                                                               
  4418.                                                                                 
  4419. *        ***********************************************                        
  4420. *        dither the greens                                                      
  4421. *        ***********************************************                        
  4422.                                                                                 
  4423.          do 21 ix = 1,nx                                                        
  4424.             ixd = mod( ix, 8 ) + 1                                              
  4425.                                                                                 
  4426.                do 22 iy = 1,ny                                                  
  4427.                   iyd = mod( iy, 8 ) + 1                                        
  4428.                                                                                 
  4429.                   if( green( ix, iy ) .le. char( d( ixd, iyd ) ) ) then         
  4430.                      green( ix, iy ) = char( 0 )                                
  4431.                   else                                                          
  4432.                      green( ix, iy ) = char( 1 )                                
  4433.                   end if                                                        
  4434.                                                                                 
  4435. 22             continue                                                         
  4436. 21       continue                                                               
  4437.                                                                                 
  4438. *        ***********************************************                        
  4439. *        dither the blues                                                       
  4440. *        ***********************************************                        
  4441.                                                                                 
  4442.          do 31 ix = 1,nx                                                        
  4443.             ixd = mod( ix, 8 ) + 1                                              
  4444.                                                                                 
  4445.                do 32 iy = 1,ny                                                  
  4446.                   iyd = mod( iy, 8 ) + 1                                        
  4447.                                                                                 
  4448.                   if( blue( ix, iy ) .le. char( d( ixd, iyd ) ) ) then          
  4449.                      blue( ix, iy ) = char( 0 )                                 
  4450.                   else                                                          
  4451.                      blue( ix, iy ) = char( 1 )                                 
  4452.                   end if                                                        
  4453.                                                                                 
  4454. 32             continue                                                         
  4455. 31       continue                                                               
  4456.                                                                                 
  4457. *        ***********************************************                        
  4458. *        combine the red, green, and blue images back                           
  4459. *        into a single image using the following rules:                         
  4460. *                                                                               
  4461. *           red                    -> magenta = 1                               
  4462. *           green                  -> cyan = 2                                  
  4463. *           blue                   -> cyan = 2                                  
  4464. *           red + green            -> white = 3                                 
  4465. *           red + blue             -> magenta = 1                               
  4466. *           green + blue           -> cyan = 2                                  
  4467. *           red + green + blue     -> white = 3                                 
  4468. *           nothing                -> background = 0                            
  4469. *        ***********************************************                        
  4470.                                                                                 
  4471.          do 5 ix = 1,nx                                                         
  4472.             do 6 iy = 1,ny                                                      
  4473.                                                                                 
  4474.                if( red( ix,iy ) .eq. char( 1 ) ) then                           
  4475.                   if( green( ix,iy ) .eq. char( 1 ) ) then                      
  4476.                      g( ix,iy ) = char( 3 )                                     
  4477.                   else                                                          
  4478.                      g( ix,iy ) = char( 1 )                                     
  4479.                   end if                                                        
  4480.                else if( green( ix,iy ) .eq. char( 1 ) ) then                    
  4481.                   g( ix,iy ) = char( 2 )                                        
  4482.                else if( blue( ix,iy ) .eq. char( 1 ) )then                      
  4483.                   g( ix,iy ) = char( 2 )                                        
  4484.                else                                                             
  4485.                   g( ix,iy ) = char( 0 )                                        
  4486.                end if                                                           
  4487.                                                                                 
  4488. 6           continue                                                            
  4489. 5        continue                                                               
  4490.                                                                                 
  4491. *     **************************************************                        
  4492. *     if the palette has less then or equal to 4 entries                        
  4493. *     just set any image pixel greater than 3 to 3                              
  4494. *     **************************************************                        
  4495.                                                                                 
  4496.       else                                                                      
  4497.                                                                                 
  4498.          do 8 ix = 1,nx                                                         
  4499.             do 9 iy = 1,ny                                                      
  4500.                if( g( ix,iy ) .gt. char( 3 ) )                                  
  4501.      .            g( ix,iy ) = char( 3 )                                        
  4502. 9           continue                                                            
  4503. 8        continue                                                               
  4504.                                                                                 
  4505.       end if                                                                    
  4506.                                                                                 
  4507.       return                                                                    
  4508.       end                                                                       
  4509. *                                                                               
  4510. *****************************************************                           
  4511. * CINPUT                                                                        
  4512. *****************************************************                           
  4513. *                                                                               
  4514.       SUBROUTINE CINPUT(C)                                                      
  4515. C DUMMY CHARACTER READ                                                          
  4516.       CHARACTER*8 C                                                             
  4517.       C = '        '                                                            
  4518.       RETURN                                                                    
  4519.       END                                                                       
  4520. *                                                                               
  4521. *****************************************************                           
  4522. * QUITG -- TERMINATES COMPRESSED RASTER DEVICE                                  
  4523. *****************************************************                           
  4524. *                                                                               
  4525.       SUBROUTINE QUITG                                                          
  4526. C THIS SUBROUTINE TERMINATES COMPRESSED RASTER DEVICE                           
  4527.       COMMON /GRDEV/ LX, LY, NBIT, IFRMT, INTRL, IXOR                           
  4528.       CHARACTER*1 BLANK                                                         
  4529.       CHARACTER*1 CHR(4)                                                        
  4530.    91 FORMAT (13H PROGRAM DONE)                                                 
  4531.       BLANK = CHAR(0)                                                           
  4532.          DO 10 I = 1, 4                                                         
  4533.             CHR(I) = BLANK                                                      
  4534.    10    CONTINUE                                                               
  4535.       CALL BUFFWR(CHR,4,IFRMT)                                                  
  4536.       CALL BUFFWR(CHR,0,IFRMT)                                                  
  4537.       WRITE (6,91)                                                              
  4538.       RETURN                                                                    
  4539.       END                                                                       
  4540. *                                                                               
  4541. *****************************************************                           
  4542. * VPARSE                                                                        
  4543. *****************************************************                           
  4544. *                                                                               
  4545. C PARSING LIBRARY FOR BEPS1                                                     
  4546. C COPYRIGHT 1990, REGENTS OF THE UNIVERSITY OF CALIFORNIA                       
  4547. C UPDATE: OCTOBER 16, 1990                                                      
  4548.       SUBROUTINE VPARSE (CODE,ICODE,CP,IP,AP,INPUT,NC,NCC,NCI,NCR,IVAR,I        
  4549.      1RC)                                                                       
  4550. C THIS SUBROUTINE PARSES INPUT STRING AND STORES APPROPRIATE VALUE INTO         
  4551. C APPROPRIATE VARIABLE.  THE VARIABLE NAMES (NC OF THEM) IN THE SYMBOL          
  4552. C TABLE CODE MUST BE SIX CHARACTERS OR LESS IN LENGTH, AND CREATED IN           
  4553. C ORDER OF TYPE CHARACTER*8 (NCC OF THEM), INTEGER (NCI OF THEM), AND           
  4554. C REAL*4 (NCR OF THEM).  INTEGER CODES CORRESPONDING TO THE CHARACTER           
  4555. C TABLE MUST HAVE BEEN CALCULATED BY CALLS TO SUBROUTINE FINDCC:                
  4556. C     NC = NCC + NCI + NCR                                                      
  4557. C     DO 10 I = 1, NC                                                           
  4558. C     CALL FINDCC(CODE(I),ICODE(I),IC)                                          
  4559. C  10 CONTINUE                                                                  
  4560. C FIRST THE ENTRY IVAR IN THE TABLE ICODE IS IDENTIFIED (IRC=1 MEANS            
  4561. C SYMBOL NOT FOUND).  THEN THE NUMERICAL VALUE OF THE CHARACTERS TO THE         
  4562. C RIGHT OF THE '=' SIGN IS FOUND (IRC=2 MEANS NO VALID VALUE FOUND), AND        
  4563. C STORED IN CP, IP, OR AP AS APPROPRIATE FOR CHARACTER, INTEGER, OR REAL        
  4564. C VARIABLES, RESPECTIVELY.                                                      
  4565. C     CHARACTER*8 CP(NCC)                                                       
  4566. C     DIMENSION IP(NCI), AP(NCR)                                                
  4567.       CHARACTER*(*) INPUT                                                       
  4568.       CHARACTER*6 CODE(NC)                                                      
  4569.       CHARACTER*8 CP(1)                                                         
  4570.       DIMENSION ICODE(NC)                                                       
  4571.       DIMENSION IP(1), AP(1)                                                    
  4572.    91 FORMAT (1X,A6,3H = ,A8)                                                   
  4573.    92 FORMAT (1X,A6,3H = ,I8)                                                   
  4574.    93 FORMAT (1X,A6,3H = ,F14.7)                                                
  4575.       IM = LEN(INPUT)                                                           
  4576.       IRC = 1                                                                   
  4577. C FIND THE EQUAL SIGN                                                           
  4578.       I = 1                                                                     
  4579.    10 IF (INPUT(I:I).EQ.'=') GO TO 20                                           
  4580.       I = I + 1                                                                 
  4581.       IF (I.LE.IM) GO TO 10                                                     
  4582.    20 I = I - 1                                                                 
  4583. C NO VARIABLE LEFT OF EQUAL SIGN                                                
  4584.       IF (I.LT.1) GO TO 80                                                      
  4585. C FIND NUMERICAL CODE FOR VARIABLE NAME                                         
  4586.       CALL FINDCC(INPUT(1:I),NUM,IC)                                            
  4587. C INVALID CHARACTERS IN NAME                                                    
  4588.       IF (IC.EQ.0) GO TO 80                                                     
  4589. C FIND VARIABLE NAME IN TABLE                                                   
  4590.       J = 0                                                                     
  4591.    30 J = J + 1                                                                 
  4592.       IF (ICODE(J).EQ.NUM) GO TO 40                                             
  4593.       IF (J.LT.NC) GO TO 30                                                     
  4594. C VARIABLE NAME NOT FOUND IN TABLE                                              
  4595.       GO TO 80                                                                  
  4596.    40 IVAR = J                                                                  
  4597.       IRC = 2                                                                   
  4598.       IF (I.LT.(IM - 1)) GO TO 50                                               
  4599. C NO VALUE RIGHT OF EQUAL SIGN                                                  
  4600.       GO TO 80                                                                  
  4601. C FIND VARIABLE TYPE                                                            
  4602.    50 IF (J.GT.NCC) GO TO 60                                                    
  4603. C CHARACTER VARIABLE                                                            
  4604.       CP(J) = INPUT(I+2:IM)                                                     
  4605.       WRITE (6,91) CODE(J), CP(J)                                               
  4606.       IRC = 0                                                                   
  4607.       GO TO 80                                                                  
  4608. C FIND VALUE                                                                    
  4609.    60 CALL EVALC(INPUT(I+2:IM),IVAL,VAL,ID)                                     
  4610. C NOT A VALID NUMBER                                                            
  4611.       IF (ID.EQ.0) GO TO 80                                                     
  4612. C VALID NUMBER                                                                  
  4613.       IRC = 0                                                                   
  4614.       NCT = NCC + NCI                                                           
  4615.       IF (J.GT.NCT) GO TO 70                                                    
  4616. C INTEGER VARIABLE                                                              
  4617.       IP(J-NCC) = IVAL                                                          
  4618.       WRITE (6,92) CODE(J), IVAL                                                
  4619.       GO TO 80                                                                  
  4620. C REAL VARIABLE                                                                 
  4621.    70 AP(J-NCT) = VAL                                                           
  4622.       WRITE (6,93) CODE(J), VAL                                                 
  4623.    80 RETURN                                                                    
  4624.       END                                                                       
  4625. *                                                                               
  4626. *****************************************************                           
  4627. * FINDCC                                                                        
  4628. *****************************************************                           
  4629. *                                                                               
  4630.       SUBROUTINE FINDCC(CVAR,NUM,IC)                                            
  4631. C THIS SUBROUTINE FINDS NUMERICAL CODE FOR VARIABLE NAME, WHICH CAN             
  4632. C CONSIST OF LETTERS AND NUMBERS.  UPPER AND LOWER CASE ARE TREATED AS          
  4633. C EQUIVALENT, AND SPACES ARE IGNORED.  IC IS NUMBER OF SYMBOLS FOUND IN         
  4634. C VARIABLE NAME (IC = 0 IS RETURNED IF ILLEGAL CHARACTER IS FOUND).             
  4635. C VARIABLE NAME MUST BE SIX CHARACTERS OR LESS IN LENGTH.                       
  4636.       CHARACTER*1 V                                                             
  4637.       CHARACTER*(*) CVAR                                                        
  4638.       DIMENSION IETA(256)                                                       
  4639.       DATA IB /36/                                                              
  4640. C ASCII CODES FOR EBCDIC 74,79,113,139,155 ARE NON-STANDARD                     
  4641. C EBCDIC CODES 28,30,106 ARE ADDED FOR IBM COMPATIBILITY                        
  4642.       DATA IETA /0,1,2,3,-1,9,-1,127,-1,-1,-1,11,12,13,14,15,16,17,18,19        
  4643.      1,-1,-1,8,-1,24,25,-1,-1,28,29,30,31,-1,-1,28,-1,-1,10,23,27,-1,-1,        
  4644.      2-1,-1,-1,5,6,7,-1,-1,22,-1,-1,30,-1,4,-1,-1,-1,-1,20,21,-1,26,32,-        
  4645.      31,-1,-1,-1,-1,-1,-1,-1,-1,92,46,60,40,43,124,38,-1,-1,-1,-1,-1,-1,        
  4646.      4-1,-1,-1,33,36,42,41,59,94,45,47,-1,-1,-1,-1,-1,-1,-1,-1,124,44,37        
  4647.      5,95,62,63,-1,94,-1,-1,-1,-1,-1,-1,-1,96,58,35,64,39,61,34,-1,97,98        
  4648.      6,99,100,101,102,103,104,105,-1,123,-1,-1,-1,-1,-1,106,107,108,109,        
  4649.      7110,111,112,113,114,-1,125,-1,-1,-1,-1,-1,126,115,116,117,118,119,        
  4650.      8120,121,122,-1,-1,-1,91,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,        
  4651.      9-1,93,-1,-1,123,65,66,67,68,69,70,71,72,73,-1,-1,-1,-1,-1,-1,125,7        
  4652.      A4,75,76,77,78,79,80,81,82,-1,-1,-1,-1,-1,-1,92,-1,83,84,85,86,87,8        
  4653.      B8,89,90,-1,-1,-1,-1,-1,-1,48,49,50,51,52,53,54,55,56,57,-1,-1,-1,-        
  4654.      C1,-1,-1/                                                                  
  4655.       IM = LEN(CVAR)                                                            
  4656.       NUM = 0                                                                   
  4657.       IC = 0                                                                    
  4658.       I = 0                                                                     
  4659.    10 I = I + 1                                                                 
  4660.       IF ((I.GT.IM).OR.(IC.GE.6)) GO TO 60                                      
  4661.       V = CVAR(I:I)                                                             
  4662.       IF (V.EQ.' ') GO TO 10                                                    
  4663. C     IV = ICHAR(V) - 64                                                        
  4664.       IV = IETA(ICHAR(V)+1) - 64                                                
  4665.       IF (IV.GT.26) GO TO 30                                                    
  4666.       IF (IV.LT.1) GO TO 40                                                     
  4667.    20 NUM = IV + IB*NUM                                                         
  4668.       IC = IC + 1                                                               
  4669.       GO TO 10                                                                  
  4670.    30 IV = IV - 32                                                              
  4671.       IF ((IV.LT.1).OR.(IV.GT.26)) GO TO 50                                     
  4672.       GO TO 20                                                                  
  4673.    40 IV = IV + 17                                                              
  4674.       IF ((IV.LT.1).OR.(IV.GT.10)) GO TO 50                                     
  4675.       IV = IV + 26                                                              
  4676.       GO TO 20                                                                  
  4677.    50 IC = 0                                                                    
  4678.    60 RETURN                                                                    
  4679.       END                                                                       
  4680. *                                                                               
  4681. *****************************************************                           
  4682. * EVALC                                                                         
  4683. *****************************************************                           
  4684. *                                                                               
  4685.       SUBROUTINE EVALC(CVAL,IVAL,VAL,ID)                                        
  4686. C THIS SUBROUTINE EVALUATES NUMERICAL VALUE OF CHARACTER STRING.                
  4687. C BOTH INTEGER, FLOATING POINT, AND E-FORMAT NUMBERS ARE ACCEPTED.              
  4688. C FOR INTEGER, RETURNS BOTH INTEGER AND REAL VALUES.                            
  4689. C FOR FLOATING POINT, RETURNS BOTH REAL RESULT AND ITS INTEGER PART.            
  4690. C FOR E-FORMAT, RETURNS REAL RESULTS AND INTEGER EXPONENT.                      
  4691. C ID IS THE NUMBER OF DIGITS FOUND.  ILLEGAL CHARACTER TERMINATES               
  4692. C EVALUATION.                                                                   
  4693.       CHARACTER*1 V                                                             
  4694.       CHARACTER*(*) CVAL                                                        
  4695.       DATA IB /10/                                                              
  4696.       IS = ICHAR('0')                                                           
  4697.       IM = LEN(CVAL)                                                            
  4698.       NUM = 0                                                                   
  4699.       NORM = 1                                                                  
  4700.       IF = 0                                                                    
  4701.       IE = 0                                                                    
  4702.       ID = 0                                                                    
  4703.       I = 0                                                                     
  4704.    10 I = I + 1                                                                 
  4705.       IF (I.GT.IM) GO TO 60                                                     
  4706.       V = CVAL(I:I)                                                             
  4707.    20 IV = ICHAR(V) - IS                                                        
  4708.       IF ((IV.LT.0).OR.(IV.GT.9)) GO TO 30                                      
  4709.       NUM = IV + IB*NUM                                                         
  4710.       ID = ID + 1                                                               
  4711.       IF (IF.EQ.1) NORM=IB*NORM                                                 
  4712.       GO TO 10                                                                  
  4713.    30 IF ((V.EQ.' ').OR.(V.EQ.'+')) GO TO 10                                    
  4714.       IF (V.NE.'-') GO TO 40                                                    
  4715.       NORM = -NORM                                                              
  4716.       GO TO 10                                                                  
  4717.    40 IF (IE.EQ.1) GO TO 60                                                     
  4718.       IF ((V.NE.'.').OR.(IF.EQ.1)) GO TO 50                                     
  4719.       IF = 1                                                                    
  4720.       GO TO 10                                                                  
  4721.    50 IF ((V.NE.'E').AND.(V.NE.'e')) GO TO 60                                   
  4722.       VAL = FLOAT(NUM)/FLOAT(NORM)                                              
  4723.       NUM = 0                                                                   
  4724.       NORM = 1                                                                  
  4725.       IE = 1                                                                    
  4726.       IF = 0                                                                    
  4727.       GO TO 10                                                                  
  4728.    60 IVAL = NUM/NORM                                                           
  4729.       IF (IE.EQ.0) VAL = FLOAT(NUM)/FLOAT(NORM)                                 
  4730.       IF (IE.EQ.1) VAL = VAL*(10.**IVAL)                                        
  4731.       RETURN                                                                    
  4732.       END                                                                       
  4733. *                                                                               
  4734. *****************************************************                           
  4735. * CLEAR  -- ERASES SCREEN FOR IBM TSO                                           
  4736. *****************************************************                           
  4737. *                                                                               
  4738.       SUBROUTINE CLEAR                                                          
  4739. C ERASES SCREEN FOR IBM MVS/TSO                                                 
  4740.       CHARACTER*5 LBL                                                           
  4741.       DATA LBL /'CLEAR'/                                                        
  4742. C     CALL IATTCH(LBL,5,IRC,ICMDRC)                                             
  4743.       RETURN                                                                    
  4744.       END                                                                       
  4745. //NAMEGEN  EXEC  PLIX,PARM='OPT(0)'                                             
  4746. //*                                                                             
  4747. //* THIS PROGRAM ADDS NAME CARDS TO OBJECT MODULES SO THAT LOAD MODULES         
  4748. //* WITH SEPERATE MEMBERS FOR EACH CSECT CAN BE CREATED. WRITTEN BY CST         
  4749.  /*  OBJECT MODULE NAME CARD GENERATOR  */                                      
  4750.  NAMEGEN: PROC OPTIONS (MAIN);                                                  
  4751.  /*  THIS PROGRAM GENERATES AND INSERTS LINKAGE EDITOR NAME CARDS               
  4752.      INTO A STREAM OF OBJECT MODULES GENERATED BY BATCHED COMPILATION.          
  4753.      THE STATEMENT 'GET_MODULE_NAME' MAY HAVE TO BE MODIFIED TO WORK            
  4754.      WITH OBJECT MODULES NOT CREATED BY THE FORTRAN COMPILERS. NOTE             
  4755.      THAT, WITH THE FORTRAN COMPILERS, THE OBJECT MODULES GENERATED BY          
  4756.      THE DECK OPTION AND WRITTEN TO SYSPUNCH CONTAIN SEQUENCE NUMBERS,          
  4757.      WHILE THE MODULES WRITTEN TO SYSLIN DO NOT.  THEREFORE, THE DECK           
  4758.      OPTION IS RECOMMENDED.  NOTE ALSO THAT NO ALIAS CARDS ARE                  
  4759.      GENERATED.  IF REQUIRED, ALIAS NAME CARDS MUST BE GENERATED BY             
  4760.      HAND.  INPUT IS READ FROM DDNAME='INFILE', AND WRITTEN TO DDNAME=          
  4761.      'OUTFILE'.                                                                 
  4762.      *****                                                                      
  4763.      WRITTEN BY C. THOMAS  --  08/30/74   */                                    
  4764.  DCL                                                                            
  4765.      A              CHAR (1),                                                   
  4766.      B              CHAR (3),                                                   
  4767.      C              CHAR (68),                                                  
  4768.      D              CHAR (4),                                                   
  4769.      E              FIXED BIN (31),                                             
  4770.      F              CHAR (8),                                                   
  4771.      K              FIXED BIN (31) INIT (0);                                    
  4772.  ON ENDFILE (INFILE)  GO TO DONE;                                               
  4773.  LOOP:  GET SKIP FILE(INFILE) EDIT (A,B,C,D,E)  (A(1), A(3), A(68),             
  4774.      A(4), F(4));                                                               
  4775.  K = K + 1;                                                                     
  4776.  PUT SKIP FILE(OUTFILE) EDIT (A,B,C,D,E)  (A(1), A(3), A(68),                   
  4777.      A(4), P'9999');                                                            
  4778.  GET_MODULE_NAME:IF  K = 1  THEN F = SUBSTR (C,13,8);                           
  4779.  IF  B ^= 'END'  THEN GO TO LOOP;                                               
  4780.  E = E + 1;                                                                     
  4781.  PUT SKIP FILE(OUTFILE) EDIT ('  NAME ', F, D, E)                               
  4782.      (A(7), A(8), COL(73), A(4), P'9999');                                      
  4783.  K = 0;                                                                         
  4784.  GO TO LOOP;                                                                    
  4785.  DONE: END NAMEGEN;                                                             
  4786. //GO.INFILE    DD  DISP=(SHR,PASS),DSN=*.COMPILE.FORT.SYSPUNCH                  
  4787. //GO.OUTFILE   DD  DISP=(NEW,PASS),DSN=&OBJOUT,UNIT=VIO,                        
  4788. //             SPACE=(TRK,(50,50),RLSE),DCB=OBJECT                              
  4789. //   EXEC  FORTLG,PARM.LKED='NCAL,LET'                                          
  4790. //LKED.SYSLIN    DD  DISP=(SHR,PASS),DSN=*.NAMEGEN.GO.OUTFILE                   
  4791. //LKED.SYSLMOD   DD  DISP=(NEW,CATLG),                                          
  4792. //   DSN=APP1.GRAPHICS.PCMOVIE,UNIT=___,                                        
  4793. //   SPACE=(TRK,(50,50),RLSE),DCB=OBJECT                                        
  4794.